網路程式設計的粘包

2022-02-15 05:23:41 字數 3625 閱讀 2878

客戶端粘包:

傳送端需要等緩衝區滿才傳送出去,造成粘包(傳送資料時間間隔很短,資料量很小,tcp優化演算法會當做乙個包發出去,產生粘包)

服務端粘包

接收方不及時接收緩衝區的包,造成多個包接收(客戶端傳送了一段資料,服務端只收了一小部分,服務端下次再收的時候還是從緩衝區拿上次遺留的資料,產生粘包)

所謂粘包問題主要還是因為接收方不知道訊息之間的界限,不知道一次性提取多少位元組的資料所造成的。

# 服務端  連線迴圈+通訊迴圈

import scoket

server = socket.socket()

server.bind(('127.0.0.1',8686)) # 本地回環位址

server.listen(5) # 半連線池 除了正在服務的 還有五個等待連線

while true:

# 連線迴圈

conn, addr = server.accept() # conn 是雙向連線通道 套接字的物件 addr是客戶端位址

while true:

# 通訊迴圈

try:

date = conn.recv(1024) # 等待接收1024位元組

ptint(date.decode('utf-8'))

if len(date) == 0:break

conn.send(date.upper()) # 返回訊息

except connectreseterror as c: #連線中斷等待下乙個連線誒

print(c)

break

conn.close()

# 客戶端

import socket

client = socket.socket()

client.connect(('127.0.0.1',8686))

while true:

cmd = input(">>>").encode('utf-8')

client.send(cmd)

date = client.recv(1024)

print(date)

# 服務端

import socket

server = socket.socket() # 買手機 不傳引數預設用的就是tcp協議

server.bind(('127.0.0.1',8080)) # bind((host,port)) 插**卡 繫結ip和埠

server.listen(5) # 開機 半連線池

conn, addr = server.accept() # 接聽** 等著別人給你打** 阻塞

data = conn.recv(5) # 聽別人說話 接收1024個位元組資料 阻塞

print(data)

data = conn.recv(5) # 聽別人說話 接收1024個位元組資料 阻塞

print(data)

data = conn.recv(4) # 聽別人說話 接收1024個位元組資料 阻塞

print(data)

# 服務端

import socket

client = socket.socket() # 拿**

client.connect(('127.0.0.1',8080)) # 撥號 寫的是對方的ip和port

client.send(b'hello')

client.send(b'world')

client.send(b'baby')

# 服務端

import socket

import subprocess

import struct

import json

server = socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(5)

while true:

conn, addr = server.accept()

while true:

try:

cmd = conn.recv(1024)

if len(cmd) == 0:break

cmd = cmd.decode('utf-8')

obj = subprocess.popen(cmd,shell=true,stdout=subprocess.pipe,stderr=subprocess.pipe)

res = obj.stdout.read() + obj.stderr.read()

d =

json_d = json.dumps(d)

# 1.先製作乙個字典的報頭

header = struct.pack('i',len(json_d))

# 2.傳送字典報頭

conn.send(header)

# 3.傳送字典

conn.send(json_d.encode('utf-8'))

# 4.再發真實資料

conn.send(res)

# conn.send(obj.stdout.read())

# conn.send(obj.stderr.read())

except connectionreseterror:

break

conn.close()

# 客戶端

import socket

import struct

import json

client = socket.socket()

client.connect(('127.0.0.1',8080))

while true:

msg = input('>>>:').encode('utf-8')

if len(msg) == 0:continue

client.send(msg)

# 1.先接受字典報頭

header_dict = client.recv(4)

# 2.解析報頭 獲取字典的長度

dict_size = struct.unpack('i',header_dict)[0] # 解包的時候一定要加上索引0

# 3.接收字典資料

dict_bytes = client.recv(dict_size)

dict_json = json.loads(dict_bytes.decode('utf-8'))

# 4.從字典中獲取資訊

print(dict_json)

recv_size = 0

real_data = b''

while recv_size < dict_json.get('file_size'): # real_size = 102400

data = client.recv(1024)

real_data += data

recv_size += len(data)

print(real_data.decode('gbk'))

網路程式設計 粘包

粘包問題的產生 tcp流式協議 基於資料流的協議 接收方產生粘包問題 1.接收方不清楚資料有多長只接收了資料的一部分 2.接收方多讀取了資料 傳送方產生的粘包問題 作業系統沒有及時傳送前一次的資料,導致兩次資料粘在一起 粘包問題的根本原因是接收方不清楚資料的長度 tcp nigle 優化機制 如果多...

python 網路程式設計 02 粘包

思考 什麼是粘包?同時執行多條命令之後,得到的結果很可能只有一部分,在執行其他命令的時候又接收到之前執行的另外一部分結果,這種顯現就是粘包。例如 send b 123 send b abc recv 4 1234 應該接收123 recv 4 bc 應該接收abc或者傳送的資料量大,一次沒有接收完,...

python網路程式設計之粘包

一 什麼是粘包 須知 只有tcp有粘包現象,udp永遠不會粘包 粘包不一定會發生 如果發生了 1.可能是在客戶端已經粘了 2.客戶端沒有粘,可能是在服務端粘了 首先需要掌握乙個socket收發訊息的原理 應用程式所看到的資料是乙個整體,或說是乙個流 stream 一條訊息有多少位元組對應用程式是不可...