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”即可領取。