Python基于TCP与UDP协议实现Socket通信

TCP协议

server.py

<code>from socket import socket tcp_server = socket() tcp_server.bind(('127.0.0.1', 9000)) tcp_server.listen() conn, addr = tcp_server.accept() msg = conn.recv(1024) print(msg) conn.send(b'hello from server') conn.close() tcp_server.close()/<code>

client.py

<code>from socket import socket tcp_client = socket() tcp_client.connect(('127.0.0.1', 9000)) tcp_client.send(b'hello from client') msg = tcp_client.recv(1024) print(msg) tcp_client.close()/<code>

UDP协议

server.py

<code>from socket import socket, SOCK_DGRAM udp_server = socket(type=SOCK_DGRAM) udp_server.bind(('127.0.0.1', 9000)) msg, client_addr = udp_server.recvfrom(1024) print(msg) udp_server.sendto(b'hello from server', client_addr) udp_server.close()/<code>

client.py

<code>from socket import socket, SOCK_DGRAM udp_client = socket(type=socket.SOCK_DGRAM) udp_client.sendto(b'hello from client', ('127.0.0.1', 9000)) msg = udp_client.recv(1024) print(msg) udp_client.close()/<code>

socketserver实现TCP协议可并发的server端

<code>from socketserver import BaseRequestHandler, ThreadingTCPServer class MyServer(BaseRequestHandler): def handle(self): # 自动触发handle方法,self.request 相当于 conn msg = self.request.recv(1024).decode('utf-8') self.request.send('收到'.encode('utf-8')) server = ThreadingTCPServer(('127.0.0.1',9000), MyServer) server.serve_forever()/<code>

struct模块解决TCP协议的粘包现象

先发送报头报头长度为4个字节,内容是即将发送的报文的字节长度struct模块中的pack方法能够把所有的数字都固定的转换成4字节再发送报文

server.py

<code>import socket import struct sk = socket.socket() sk.bind(('127.0.0.1', 9000)) sk.listen() conn, _ = sk.accept() byte_len1 = conn.recv(4) size1 = struct.unpack('i', byte_len1)[0] msg1 = conn.recv(size1) print(msg1) byte_len2 = conn.recv(4) size2 = struct.unpack('i', byte_len2)[0] msg2 = conn.recv(size2) print(msg2) conn.close() sk.close()/<code>

client.py

<code>import socket import struct sk = socket.socket() sk.connect(('127.0.0.1', 9000)) msg1 = b'hello' byte_len1 = struct.pack('i', len(msg1)) sk.send(byte_len1) sk.send(msg1) msg2 = b'world' byte_len2 = struct.pack('i', len(msg2)) sk.send(byte_len2) sk.send(msg2) sk.close()/<code>

结尾

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。