socket__服务端于客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/8/23 15:33 # @Author : Mr_zhang # @Site : # @File : 服务端.py # @Software: PyCharm from socket import * import subprocess,struct,json phone = socket(AF_INET,SOCK_STREAM) phone.setsockopt(SOL_SOCKET,SO_REUSEADDR, 1 ) phone.bind(( '127.0.0.1' , 8080 )) phone.listen( 7 ) print ( 'startting....' ) #程序运行 while True : conn,client_addr = phone.accept() #等待链接,返回链接消息和客户端的IP和端口 print (conn,client_addr) #查看打印信息 print ( '---------->' ,conn,client_addr) while True : try : cmd = conn.recv( 1024 ) if not cmd: break res = subprocess.Popen(cmd.decode( 'utf-8' ),shell = True ,stdout = subprocess.PIPE,stderr = subprocess.PIPE) stdout = res.stdout.read() stderr = res.stderr.read() header_dic = { 'total_size' : len (stdout) + len (stderr), 'filename' : None , 'md5' : None } #制作报头 header_json = json.dumps(header_dic) #序列化报头 header_bytes = header_json.encode( 'utf-8' ) #序列化转码 conn.send(struct.pack( 'i' , len (header_bytes))) conn.send(header_bytes) conn.send(stdout) conn.send(stderr) except Exception: break conn.close() phone.close() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/8/23 15:34 # @Author : Mr_zhang # @Site : # @File : 客户端.py # @Software: PyCharm from socket import * import struct,json phone = socket(AF_INET,SOCK_STREAM) phone.connect(( '127.0.0.1' , 8080 )) while True : cmd = input ( '>>>:' ).strip() if not cmd: continue phone.send(cmd.encode( 'utf-8' )) #发送出去的消息需要转码 header_len = struct.unpack( 'i' ,phone.recv( 4 ))[ 0 ] #接收到的消息解包 ([0]表示元组中的第一个值(报头)) header_bytes = phone.recv(header_len) #接收到的后续包 header_json = header_bytes.decode( 'utf-8' ) #基于上一行进行转码 header_dic = json.loads(header_json) #饭序列化 total_size = header_dic[ 'total_size' ] #反序列化之后得到的header_dic中的total_size大小 recv_size = 0 total_data = b'' while recv_size < total_size: recv_data = phone.recv( 1024 ) recv_size + = len (recv_data) total_data + = recv_data print (total_data.decode( 'gbk' )) phone.close() |
本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/7419060.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)