【python】socket网络编程
1.socket
网络传输的相关概念
端口:数据传输的通道
端口号:端口的唯一标识
端口与端口号关系:一一对应,通过端口号就能找到唯一的端口
网络通信三要素:ip、端口、协议
端口分类:
知名端口号(0~1023)
动态端口号(1024~65535)
socket
socket一般指套接字。所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端。套接字上联应用进程,下联网络协议栈
进程间网络传输的工具
TCP:(Transmission Control Protocol)传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议
步骤:建立连接、传输数据、关闭连接
特点:
1.面向连接
2.可靠传输(应答机制、超时重传、错误校验、流量控制)
2.客户端
客户端向服务端发送请求,服务端响应返回数据。客户端的请求步骤大概是以下5个
1.创建客户端套接字对象
2.连接服务器端
3.发送消息
4.接收消息
5.关闭链接
import socket
# 创建socket,参数,AF_INET代表ipv4,SOCK_STREAM代表tcp协议
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端socket,参数一个元组
client_socket.connect(('localhost', 6999))
# 给服务器发送数据,只能发送二进制数据,所以先编码
client_socket.send('你好呀'.encode('utf-8'))
# 接收服务器返回的数据,每次最大接收1024字节
recv_data = client_socket.recv(1024)
print(recv_data.decode('utf-8'))
# 关闭socket,释放资源
client_socket.close()
3.服务端
服务端会阻塞等待客户端的请求,可能是一对多,所以我们可以开启多个线程同时处理多个客户端的请求
服务端的工作流程大概7个步骤
1.创建服务端socket对象:s1 = socket.socket(参数)
2.绑定端口号:s1.bind(('ip,端口))
3.设置监听模式(设置当前socket对象为被动链接):s1.listen(最大连接数)
4.等待客户端连接(一旦有客户端连接,会创建一个新的socket对象):new_s,ip_port = s1.accept()
5.使用新的socket接收客户端数据:recv_data=new_s.recv(最大字节数).decode(编码)
6.使用新的socket发送数据给客户端:new_s.send(‘字符串’.encode(编码))
7.关闭socket:s1.close(),new_s.close()
import socket
import threading
def handle_client_request(client_socket, ip_port):
while True:
# 接收客户端的数据,每次最大接收1024字节
recv_data = client_socket.recv(1024)
# 判断客户端是否还在传输数据
if recv_data:
print(recv_data.decode('utf-8'), ip_port)
# 给客户端发送数据
client_socket.send('正在处理中...'.encode('utf-8'))
else:
print('客户端下线了')
break
# 关闭socket
client_socket.close()
if __name__ == '__main__':
# 创建socket,参数,AF_INET代表ipv4,SOCK_STREAM代表tcp协议
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用,因为服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定ip和端口
tcp_server_socket.bind(('localhost', 6999))
# 设置监听,参数是运行的最大力连接数
tcp_server_socket.listen(128)
while True:
# 阻塞等待客户端连接,获得客户端的socket和ip端口
client_socket, ip_port = tcp_server_socket.accept()
print('客户端连接成功:', ip_port)
# 开启线程去处理客户端的业务
sub_thread = threading.Thread(target=handle_client_request, args=(client_socket, ip_port))
# 设置守护主线程,避免无法关闭
sub_thread.setDaemon(True)
sub_thread.start()
本文地址:https://blog.csdn.net/qq_39147299/article/details/107877673
下一篇: 无线城域网-无线广域网