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收发消息的原 ...
随机推荐
- git忽略UserInterfaceState.xcuserstate
使用sourceTree, 忽略
- Java之旅_高级教程_Java Mysql连接(1)
工具:Eclipse .mysql5.7 MySQL连接驱动:mysql-connector-java-5.1.27.jar 获取地址:https://dev.mysql.com/downloa ...
- UI自动化遇到的问题
1.找不到元素:查看是否有[frame]或者[iframe]元素 2.click无响应:1)使用sendkeys(Keys.Enter) 还是无响应:使用js定位 3.弹框处理: 确认:switcht ...
- Pandas之Dateframe 实现Excel读取与写入
目的:有时需对数据进行到出到Excel,直观的给别人参阅,或从Excel中读取数据进行操作和分析依赖库 pandas 可简单的读出和写入 1,根据Excel读取( 需安装xlrd库) import n ...
- Joda Time - 强大易用的日期和时间库
Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. Joda-Ti ...
- abap method中的异常处理
1: 抛出异常 2: 处理异常
- Vue+typescript报错项
39:1 Unable to resolve signature of class decorator when called as an expression. Type '<VC exten ...
- finally最常用的情况
通常用于关闭(释放)资源例如:数据库连接 执行查询时查到需要的需要后 需要关闭连接, 此处连接就需要在获取到结果后 就断开连接 不然访问人数过多,数据库有最大连接数,超过了就只能等待前 ...
- keras实例学习-双向LSTM进行imdb情感分类
源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py 及keras中文文档 1. ...
- word2vec训练出来的相似词歧义
[问题]word2vec训练以后,得到预付卡和购物卡非常接近,可是实际上这两个东西是不一样的,如何区分这两个东西? 解决:建立一个独立词典,这个词典里的词是没有近义词的,独立的词,比如预付卡是很独特的 ...