socket粘包的处理方法示例

该博客展示了如何使用Python的socket库创建一个TCP服务器,监听特定IP和端口,接收客户端连接并执行操作系统命令。服务器通过子进程模块处理客户端发送的命令,返回标准输出和错误信息。客户端则发送命令,接收并打印服务器响应的数据。
摘要由CSDN通过智能技术生成

sever

import struct # 把有限长度的数字变成4个字节
import subprocess # 引入子进程模块
import socket

sever = socket.socket()
sever.bind((‘192.168.3.7’, 9000))
sever.listen(5)
while 1:
print(‘sever working 开始等待链接’)
conn, addr = sever.accept()
while 1:
try:
data = conn.recv(1024)
res = subprocess.Popen(data.decode(‘utf-8’), # 创建子进程对象 第一个参数是操作系统命令string类型
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read() # 操作系统命令标准错误 返回的字符串
out = res.stdout.read() # 操作系统命令标准输出 返回的字符串
if err:
conn.send(struct.pack(‘i’, len(err)))
conn.send(err)
break
else:
conn.send(struct.pack(‘i’, len(out)))
conn.send(out)
break
except ConnectionResetError as e:
break
conn.close()

client

import socket
import struct # 结构模块,可以把integer类型的数据压缩成4个字节,用于接受文件的报头(数据传输长度)
while 1:
client = socket.socket()
client.connect((‘192.168.3.7’, 9000))
user_iniput = input()
client.send(user_iniput.encode(‘utf-8’))
data = client.recv(4) # 固定接受4个字节
# print(data)
head_pack = struct.unpack(‘i’, data) # head_pack = 接受到的报头字节类型转换成integer类型
main_data = ‘’.encode(‘utf-8’) # 之后准备接收数据 设定为空
while len(main_data) < head_pack[0]: # head_pack 返回的是元组(integer, ) 当总数据长度小于报头长度
data1 = client.recv(1024) # 反复接收1024字节数据
main_data += data1 # 接收来的数据累加
print(main_data.decode(‘gbk’))
client.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值