Python全栈-网络编程-TCP粘包
一、什么是TCP粘包
二、处理思路
三、实现方式
方法一:
# 客户端
import socket
import struct IP = '127.0.0.1'
PORT = 8080
bufsize = 1024 client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((IP,PORT)) while True:
cmd = input('cmd>>>').strip()
if len(cmd) == 0:continue
elif cmd == 'q':break client_socket.send(cmd.encode('utf-8')) # 1.接收固定报头
header = client_socket.recv(4) # 2.解析报头
total_size = struct.unpack('i',header)[0]
print(total_size) # 3.根据包头接收真实数据
recv_size = 0
# 保存接收的数据(接收到的是byte类型)
res_data = b''
while recv_size < total_size:
recv_data = client_socket.recv(1024)
res_data += recv_data
recv_size += len(recv_data) print(recv_data.decode('gbk')) client_socket.close() # 服务端
import socket
import subprocess
import struct IP = '127.0.0.1'
PORT = 8080
bufsize = 1024 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.bind((IP,PORT),)
tcp_socket.listen(5) while True:
conn,addr = tcp_socket.accept()
print('客户端:',addr) while True:
try:
cmd = conn.recv(bufsize)
res = subprocess.Popen(cmd.decode('utf-8'),shell=True
,stdin=subprocess.PIPE
,stdout=subprocess.PIPE
,stderr=subprocess.PIPE)
stderr = res.stderr.read()
stdout = res.stdout.read() # 1.制作固定长度的报头
total_size = len(stdout) + len(stderr)
header = struct.pack('i',total_size) # 2.发送报头
conn.send(header) # 3.发送真实数据
conn.send(stderr)
conn.send(stdout)
except ConnectionResetError:
break
conn.close()
tcp_socket.close()
解决粘包问题
方法二:
# 客户端
import socket
import struct
import json IP = '127.0.0.1'
PORT = 8080
bufsize = 1024 client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect((IP,PORT)) while True:
cmd = input('cmd>>>').strip()
if len(cmd) == 0:continue
elif cmd == 'q':break client_socket.send(cmd.encode('utf-8')) # 1.接收包头长度
header_size = struct.unpack('i',client_socket.recv(4))[0] # 2.接收报头
header_bytes = client_socket.recv(header_size) # 3.解析报头
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
# print(header_dic) total_size = header_dic['total_size'] # 3.根据包头接收真实数据
recv_size = 0
# 保存接收的数据(接收到的是byte类型)
res_data = b''
while recv_size < total_size:
recv_data = client_socket.recv(1024)
res_data += recv_data
recv_size += len(recv_data) print(recv_data.decode('gbk')) client_socket.close() # 服务端
import socket
import subprocess
import struct
import json IP = '127.0.0.1'
PORT = 8080
bufsize = 1024 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.bind((IP,PORT),)
tcp_socket.listen(5) while True:
conn,addr = tcp_socket.accept()
print('客户端:',addr) while True:
try:
cmd = conn.recv(bufsize)
res = subprocess.Popen(cmd.decode('utf-8'),shell=True
,stdin=subprocess.PIPE
,stdout=subprocess.PIPE
,stderr=subprocess.PIPE)
stderr = res.stderr.read()
stdout = res.stdout.read() # 1.制作固定长度的报头
header_dic = {
'total_size':len(stdout) + len(stderr),
'md5':'123sssss222',
'filename':'120.txt'} header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8') # 2.发送报头的长度
total_size = len(header_bytes)
conn.send(struct.pack('i',total_size)) # 发送报头
conn.send(header_bytes) # 3.发送真实数据
conn.send(stderr)
conn.send(stdout)
except ConnectionResetError:
break
conn.close()
tcp_socket.close()
解决粘包问题
Python全栈-网络编程-TCP粘包的更多相关文章
- Python之路 - 网络编程之粘包
Python之路 - 网络编程之粘包 粘包
- Python全栈-网络编程基础
一.C/S架构 1.硬件C/S架构 如PC-打印机 2.软件C/S架构 如PC-网站服务器 参照: https://baike.baidu.com/item/Client%2FServer/15044 ...
- python套接字解决tcp粘包问题
python套接字解决tcp粘包问题 目录 什么是粘包 演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- python语法基础-网络编程-TCP协议和UDP协议
############### 网络编程 ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- python socket网络编程之粘包问题详解
一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...
- Python网络编程,粘包、分包问题的解决
tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...
- python网络编程之粘包
一.什么是粘包 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了 首先需要掌握一个socket收发消息的原 ...
随机推荐
- [knowledge] big data things
http://hadoop.apache.org/ https://spark.apache.org/ https://nifi.apache.org/ https://www.cloudera.co ...
- Guava cache 示例
pom.xml <!-- guava --> <dependency> <groupId>com.google.guava</groupId> < ...
- 10.2-uC/OS-III内部任务管理(任务状态)
1.任务状态 从用户的观点来看,任务可以是有 5种状态,见图 5-6.展示了任务状态间的转换关系. {休眠状态,就绪状态,运行状态,挂起状态,中断状态} (1).处于休眠状态的任务驻留于内存但未被uC ...
- mysql 数据操作 目录
mysql 记录的增删改查 mysql 数据操作 单表查询 mysql 数据操作 多表查询
- 20181211 Oracle Parallel
如下用Select作为参考, Select 在sql server中如果直接查询大量的数据,方式为给列增加Index,可以提高效率.如果查询数据量非常大的时候其实效率依旧不高,而且index在增删改中 ...
- 数据库——MongoDB
what's the MongoDB MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式 ...
- pycharm 如何设置函数调用字体颜色
一.pycharm 如何设置函数调用字体颜色 1.打开pycharm编辑器,file > settings > editor > color scheme > python & ...
- 【剑指offer】部分思路整理
题目 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去 ...
- LVS+Keepalived高可用部署
一.LVS+Keepalived高可用部署 一.keepalived节点部署 1.安装keepalived yum install keepalived ipvsadm -y mkdir -p /op ...
- 大牛推荐的10本学习 Python 的好书
Python:蛇亚目蟒科,主要包括分布于非洲及亚洲的无毒蟒蛇. Python:Richard Clabaugh拍摄的恐怖电影,2000年发行. Python:澳大利亚汽车公司. Python:英国偶发 ...