粘包是指兩次輸出結果粘到一起,它的發生主要是因為socket緩衝區導致的,粘包只在tcp中產生,不在udp產生
使用struct模組,先報頭長度進行打包發給客戶端,客戶端收到之後先解包報頭長度,再接收真實的資料
例子:
服務端:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
import subprocess
import struct
import json
phone=socket.socket(socket.af_inet,socket.sock_stream)
# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
phone.bind(('127.0.0.1',9909)) #0-65535:0-1024給作業系統使用
phone.listen(5)
print('starting...')
while true: # 鏈結迴圈
conn,client_addr=phone.accept()
print(client_addr)
while true: #通訊迴圈
try:
#1、收命令
cmd=conn.recv(8096)
if not cmd:break #適用於linux作業系統
#2、執行命令,拿到結果
obj = subprocess.popen(cmd.decode('utf-8'), shell=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe)
stdout=obj.stdout.read()
stderr=obj.stderr.read()
#3、把命令的結果返回給客戶端
#第一步:製作固定長度的報頭
header_dic=
header_json=json.dumps(header_dic)
header_bytes=header_json.encode('utf-8')
#第二步:先傳送報頭的長度
conn.send(struct.pack('i',len(header_bytes)))
#第三步:再發報頭
conn.send(header_bytes)
#第四步:再傳送真實的資料
conn.send(stdout)
conn.send(stderr)
except connectionreseterror: #適用於windows作業系統
break
conn.close()
phone.close()
客戶端:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
import struct
import json
# 產生物件
phone = socket.socket(socket.af_inet,socket.sock_stream)
# 進行連線
phone.connect(('192.168.43.129',8082))
while true:
# 收發訊息
msg = input('>>:').strip()
if not msg:continue
phone.send(msg.encode('utf-8'))
#先收報頭長度
obj = phone.recv(4)
header_size = struct.unpack('i',obj)[0]
#接收報頭
header_bytes = phone.recv(header_size)
#解析對真實資料的描述資訊
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
total_size = header_dic['total_size']
#接收真實的資料
rev_size = 0
rev_data = b''
while rev_size < total_size: # 如果接收的資料小於從報頭中解析出來的資料會一直迴圈進行接收
res = phone.recv(1024)
rev_data += res
rev_size += len(res)
print(rev_data.decode('utf-8'))
phone.close()
解決粘包現象
簡單版 服務端 usr bin env python coding utf 8 author mr.yang import socket import struct import subprocess phone socket.socket socket.af inet,socket.sock st...
粘包現象與解決辦法
一 什麼是粘包現象 須知 只有tcp有粘包現象,udp永遠不會粘包 粘包不一定會發生,如果發生了 1.可能是在客戶端已經粘了,2.客戶端沒有粘,可能是在服務端粘了 粘包現象 tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。成因 所謂粘包...
socket粘包最終解決方案(配置報頭)
套接字 就是將傳輸層以下的協議封裝成子介面 對於應用程式來說只需呼叫套接字的介面,寫出的程式自然是遵循tcp或udp協議的 實現第乙個功能個 實現 通過客戶端向服務端傳送命令,調取windows下面的cmd視窗,將服務端執行命令的結構,返回並顯示在 客戶端視窗上。subprocess 1.可以將執行...