python 缓冲区 subprocess 黏包 黏包解决方案
2024-10-06 05:40:00
一.缓冲区
二.两种黏包现象
两种黏包现象:
1 连续的小包可能会被优化算法给组合到一起进行发送
黏包现象1客户端
import socket
BUFSIZE = 1024
ip_prort = ('127.0.0.1',8001) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) res = s.connect(ip_prort) s.send('hi'.encode('utf-8'))
s.send('meinv'.encode('utf-8'))
黏包现象1服务端
from socket import *
ip_prot = ('127.0.0.1',8001) tcp_socket_server = socket(AF_INET,SOCK_STREAM) tcp_socket_server.bind(ip_prot) tcp_socket_server.listen(5) conn,addr = tcp_socket_server.accept() data1 = conn.recv(10)
data2 = conn.recv(10) print('->>>>>',data1.decode('utf-8'))
print('->>>>>',data2.decode('utf-8')) conn.close()
2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱
黏包现象2客户端
import socket client = socket.socket() ip_prot ='127.0.0.1',8002 client.connect(ip_prot) while 1:
cmd = input('请输入指令') client.send(cmd.encode('utf-8')) server_cmd_result = client.recv(1025) print(server_cmd_result.decode('GBK'))
黏包现象2服务端
import socket
import subprocess server = socket.socket() ip_prot = '127.0.0.1', 8002 server.bind(ip_prot) server.listen() conn, addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'), # 传入的cmd命令
shell=True,
stdout=subprocess.PIPE, # 正确结果的存放位置
stderr=subprocess.PIPE # 错误结果的存放位置
) std_msg = sub_obj.stdout.read() # 获得管道里面拿到结果 print('指令的执行结果长度>>>>', len(std_msg)) conn.send(std_msg)
三.黏包解决方案
客户端
import socket
import struct client = socket.socket()
ip_port = '127.0.0.1',8001 client.connect(ip_port) while 1:
cmd = input('请输入指令') # 发送指令 client.send(cmd.encode('utf-8')) server_res_len = client.recv(4) msg_len = struct.unpack('i',server_res_len)[0] print('来自服务器端的消息长度',msg_len) server_cmd_result = client.recv(msg_len) print(server_cmd_result.decode('GBK'))
服务端
import socket
import subprocess
import struct server = socket.socket()
ip_port = '127.0.0.1',8001 server.bind(ip_port) server.listen() conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen( from_client_cmd.decode('utf-8'),
shell = True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
) std_msg = sub_obj.stdout.read() std_msg_len = len(std_msg) print('指令的执行结果长度>>>>',std_msg_len) msg_lenint_struct = struct.pack('i',std_msg_len) conn.send(msg_lenint_struct + std_msg)
最新文章
- 如何用Dummy实例执行数据库的还原和恢复
- August 24th 2016 Week 35th Wednesday
- linux下使用SSL代理(SSLedge)
- 【leetcode❤python】Binary Watch
- BIP_开发案例02_BI Publisher中复杂案例实现代码(案例)
- glibc strlen delphi pascal
- #pragma weak
- 搭建VPN服务器之PPTP
- Sqlserver通过链接服务器访问Oracle
- windows2012R2虚拟机快速激活的方法
- Java中的编码格式
- 20个Linux命令及Linux终端的趣事
- Python标准库:内置函数dict(iterable, **kwarg)
- Chrome控制台 JS调试
- PC端网页的基本构成
- ORACLE分区表、分区索引详解
- 源码讲解 node+mongodb 建站攻略(一期)第二节
- WordPress版微信小程序3.1.5版的新功能
- 【微信小程序】模仿58同城页面制作以及动态数据加载
- 通过apicloud实现的混合开发App的Demo