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 socketsk = 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 socketsk = 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演算法 將多次間隔較小且資料量小的資料,合...