tcp和udp和黏包

2022-06-29 13:33:08 字數 3592 閱讀 5924

tcp建立連線的過程

server端

# import socket

## sk =socket.socket() #建立乙個socket物件

# sk.bind((

'127.0.0.1

',8088

)) #繫結ip位址和埠

# sk.listen()

# while1:

# conn,addr =sk.accept() #等待建立連線

# #阻塞 直到連線建立才往下執行

#

while1:

# ret = conn.recv(1024).decode('

utf-8

') #阻塞 知道收到 才往下執行

# print(ret)

# if'

bye'

inret:

# conn.send(b

'bye')

#

break

# info = input('

>>>')

# conn.send(info.encode(

'utf-8'))

## conn.close() #斷開連線

# sk.close() # 關閉socket物件 如果不關閉 仍能傳輸

client端

# import socket

# sk =socket.socket()

# sk.connect((

'127.0.0.1

',8088))#

# while1:

# msg = input('

>>>')

# sk.send((

'client1

'+msg).encode('

utf-8'))

# ret = sk.recv(1024).decode('

utf-8')

# print(ret)

#

if ret == '

bye'

:# sk.send(b

'bye')

#

break

## sk.close()

udp協議

server端

import socket

sk = socket.socket(type=socket.sock_dgram)

sk.bind((

'127.0.0.1

',8088

))while1:

msg,addr = sk.recvfrom(1024

) print(addr)

print(msg.decode(

'utf-8'))

info = input("

>>>

").encode('

utf-8')

sk.sendto(info,addr)

sk.close()

client端

import socket

sk = socket.socket(type=socket.sock_dgram)

ip_port = (('

127.0.0.1

',8088

))while1:

info = input('1:'

) info = ('

\033[34m來自1的訊息:%s\033[0m

'%info).encode('

utf-8')

sk.sendto(info,ip_port)

msg,addr = sk.recvfrom(1024

) print(msg.decode(

'utf-8'))

sk.close()

黏包黏包只存在tcp協議中,tcp內部優化演算法,報文分片傳輸,

黏包的原因:

1,傳送大於接收的位元組數,後續資訊會在下次傳送。

2,連續傳送短報文,tcp會自動處理成一段報文傳送

黏包的解決:借用struc模組

server端

# import socket

# import

struct

# sk =socket.socket()

# sk.bind((

'127.0.0.1

',8088

))# sk.listen()

## conn,addr =sk.accept()

# while1:

## cmd = input('

>>>')

#

if cmd == 'q'

:#

break

# conn.send(cmd.encode(

'gbk'))

# num = conn.recv(4

) #接收4個位元組

# num = struct.unpack('

i',num)[0

] #轉成資料長度

# ret = conn.recv(int(num)).decode('

gbk'

)# print(ret)

## conn.close()

# sk.close()

client端

# import socket

# import subprocess

# import

struct

# sk =socket.socket()

# sk.connect((

'127.0.0.1

',8088

))#

while1:

# cmd = sk.recv(1024).decode('

gbk'

)#

if cmd == 'q'

:#

break

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

# std_out =res.stdout.read()

# std_err =res.stderr.read()

# num = len(std_out)+len(std_err)

# num_by = struct.pack('i'

,num)

# sk.send(num_by)

# sk.send(std_out)

# sk.send(std_err)

# sk.close()

關於TCP黏包問題

最近發現自己對於tcp通訊中的黏包問題還有疑問,查閱資料做下總結。一 tcp黏包問題 tcp黏包問題是因為傳送方把若干資料傳送,接收方收到資料時候黏在一包,從接受緩衝區來看,後一包的資料黏在前一包的尾部。二 黏包出現的原因 tcp黏包問題主要出現在兩個方面 1 傳送方問題 首先tcp會預設使用nag...

python之黏包和黏包解決方案

黏包現象主要發生在tcp連線,基於tcp的套接字客戶端往服務端上傳檔案,傳送時檔案內容是按照一段一段的位元組流傳送的,在接收方看來,根本不知道該檔案的位元組流從何處開始,在何處結束.兩種黏包現象 1 連續的小包可能會被優化演算法給組合到一起進行傳送 2 第一次如果傳送的資料大小2000b接收端一次性...

Python TCP的黏包問題以及UDP的分片問題

tcp transport control protocol,傳輸控制協議 是面向連線的,面向流的,提供高可靠性服務。收發兩端 客戶端和伺服器端 都要有一一成對的socket,因此,傳送端為了將多個發往接收端的包,更有效的發到對方,使用了優化方法 nagle演算法 將多次間隔較小且資料量小的資料,合...