基于TCP协议的远程终端控制并发socketserver实现以及粘包问题处理
2024-09-07 20:55:46
# 客户端 # -*- coding: utf-8 -*- import socketserver
import struct
import json
import subprocess class MyTcpHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
cmd = self.request.recv(1024)
if not cmd: break
print(cmd.decode('utf-8'))
obj = subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
# 制作报头
header_dic = {
'file_name': cmd.decode('utf-8'),
'data_size': len(stdout) + len(stderr)
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
# 发送报头字典长度
self.request.send(struct.pack('i', len(header_bytes)))
# 发送报头
self.request.send(header_bytes)
# 发送正文
self.request.send(stdout + stderr)
except ConnectionResetError:
break if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyTcpHandler)
server.serve_forever()
# 服务端 # -*- coding: utf-8 -*- from socket import *
import struct
import json client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) while True:
cmd = input('>>>:').strip()
if not cmd:
continue
client.send(cmd.encode('utf-8'))
# 先接收报头长度并解析
dic_size = client.recv(4)
header_size = struct.unpack('i', dic_size)[0]
# 获取报头字典
header_json = client.recv(header_size).decode('utf-8')
header_dic = json.loads(header_json)
file_size = header_dic['data_size']
get_size = 0
info = b''
while get_size < file_size:
data = client.recv(1024)
get_size += len(data)
info += data
print(info.decode('gbk'))
最新文章
- exynos4412中断编程
- spring 事务传播特性 和隔离级别
- angular(3)服务 --注入---自定义模块--单页面应用
- .Net Attribute详解(上)-Attribute本质以及一个简单示例
- Qt5 任务栏托盘功能实现
- The authenticity of host 192.168.0.xxx can&#39;t be established.
- CentOS(三)--初识linux的文件系统以及用户组等概念
- POJ 1466 最大独立集入门
- js url编码函数
- c# gdi+输出成不同mime类型的图片
- caffe在windows编译project及执行mnist数据集測试
- selenium + robotframework的运行原理
- 40. Combination Sum II(midum, backtrack, 重要)
- openlayers3 实现点选的几种方式
- 【全网最全的博客美化系列教程】08.自定义地址栏Logo
- Windows2012 要远程登录,你需要具有通过远程桌面服务进行登录的权限.
- css3实现不同的loading
- 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周
- Python的函数基础
- You are not late! You are not early!
热门文章
- Intelij idea 中文字体渲染异常解决方法
- postman传数组参数
- 工控随笔_24_西门子TIA 博图硬件目录的更新
- 小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
- 【NPDP笔记】第五章 工具与度量
- 191128A学习入门-典型信号,单位冲激信号
- MySQL Community Server 8.0.16
- 小甲鱼汇编语言学习笔记——day02
- Redis解决“重试次数”场景的实现思路
- python+selenium实现自动化百度搜索关键词