粘包現象與解決方案

2022-08-12 10:06:22 字數 2461 閱讀 6659

粘包是指兩次輸出結果粘到一起,它的發生主要是因為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.可以將執行...