客戶端粘包:
傳送端需要等緩衝區滿才傳送出去,造成粘包(傳送資料時間間隔很短,資料量很小,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 一條訊息有多少位元組對應用程式是不可...