1. 程式人生 > >python學習筆記(47) 黏包現象

python學習筆記(47) 黏包現象

tcp會黏包但是不會丟包  #因為組合(傳送端緩衝區滿)和拆分(多個包接收)資料包

udp不會黏包,但是會丟包  #sendto函式最大能傳送資料的長度為:65535-ip頭(20)-UDP頭(8)=65507位元組

              超長會報錯並丟包

tcp_sever:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen()

conn, addr = sk.accept()
while True:
cmd = input('>>>')
conn.send(cmd.encode('utf-8'))
ret = conn.recv(1024).decode('utf-8')
print(ret)

conn.close()
sk.close()

tcp_client:

import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1',8090))
while 1:
cmd = sk.recv(1024).decode('gbk')
ret = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
std_out = 'stdout:' + (ret.stdout.read().decode('gbk'))
std_err = 'stderr:' + (ret.stderr.read().decode('gbk'))
sk.send(std_out.encode('utf-8'))
sk.send(std_err.encode('utf-8'))
sk.close()

udp_sever:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8090))
msg,addr = sk.recvfrom(1024)
while True:
cmd = input('>>>')
if cmd == 'q':
break
sk.sendto(cmd.encode('utf-8'),addr)
ret = sk.recv(1024).decode('utf-8')
print(ret)

sk.close()

udp_client:

import socket
import subprocess
sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1',8090)
while 1:
sk.sendto('吃了麼'.encode('utf-8'),addr)
cmd,addr = sk.recvfrom(1024)
ret = subprocess.Popen(cmd.decode('gbk'), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
std_out = 'stdout:' + (ret.stdout.read().decode('gbk'))
std_err = 'stderr:' + (ret.stderr.read().decode('gbk'))
sk.sendto(std_out.encode('utf-8'),addr)
sk.sendto(std_err.encode('utf-8'),addr)
sk.close()