所謂粘包問題主要仍是由於接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所形成的。
python
#struct模塊介紹 #該模塊能夠把一個類型,如數字,轉成固定長度爲4的bytes類型 import struct res = struct.pack('i',12345) #i表示整數int print(res,len(res),type(res)) #長度是4 res2 = struct.pack('i',12345111) print(res,len(res),type(res2)) #長度也是4 unpack_res =struct.unpack('i',res2) print(unpack_res) #(12345111,) print(unpack_res[0]) #12345111
###################客戶端client################### #!/usr/bin/env python # -*- coding:utf-8 -*- import socket import struct sock=socket.socket() sock.connect(('127.0.0.1', 13459)) content1='我好'.encode('utf-8') #要發送消息 content2='他也好'.encode('utf-8') con1_len=struct.pack('i',len(content1)) # 計算要發送消息(字節)的長度,並使用struct模塊轉化爲長度爲4的字節b'\x06\x00\x00\x00' sock.send(con1_len) #先把這個4字節的報文發送 sock.send(content1) #發送內容 con2_len=struct.pack('i',len(content2)) sock.send(con2_len) sock.send(content2) sock.close()
###################服務端server################### #!/usr/bin/env python # -*- coding:utf-8 -*- import struct import socket sock = socket.socket() #買手機 sock.bind(('127.0.0.1', 13459)) #插卡 sock.listen(10) #開機(同時最大鏈接10) conn, addr = sock.accept() #(受)與cilent端connect(攻)對應. msg = conn.recv(4) #首先接收4個字節(4個字節由client端struct模塊轉化) len_msg= struct.unpack('i',msg) #struct模塊讀取報文,判斷跟隨數據長度.返回值是一個元祖(6,) size_msg=len_msg[0] #取值判斷跟隨數據長度 msg = conn.recv(size_msg) #接收報文讀取長度字節 print(msg.decode('utf-8')) #解碼輸出 msg=conn.recv(4) len_msg=struct.unpack('i',msg) size_msg=len_msg[0] msg = conn.recv(size_msg) print(msg.decode('utf-8')) conn.close() sock.close()
!重要struct模塊轉化與讀取都是對字節進行操做!算法