摘要:正确示例不断完善中请输入通信内容来自服务器的消息循环连接接入服务器来自客户端的消息先发送报头长度发送报头客户端中止链接
需求:
编写C/S架构的程序,实现远程执行命令,思路如下
1、客户端接收用户输入的命令,然后发送给服务端,
2、服务端根据传来的数据调用subprocess模块执行系统命令,然后将结果返回给客户端,在客户端打印
错误归纳,续更,(正确示例请挪步下翻至底):
1、在客户端接受到服务端发送的报头,遗漏读取报头长度的错误:
</>复制代码
header_bytes = client.recv(header_size)
2、如下图,strcut解包时,得到结果为元组,应当使用索引取值。
</>复制代码
header_size = struct.unpack("i",client.recv(4))[0]
正确示例(不断完善中)
client.py
</>复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/04/20 14:51
# @Author : MJay_Lee
# @File : client.py
# @Contact : limengjiejj@hotmail.com
import socket
import struct
import json
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))
while True:
cmd = input("请输入通信内容>>:").strip()
client.send(cmd.encode("utf-8"))
header_size = struct.unpack("i",client.recv(4))[0]
header_bytes = client.recv(header_size)
header_json = header_bytes.decode("utf-8")
header_dic = json.loads(header_json)
total_size = header_dic["header_len"]
recv_size = 0
res = b""
while recv_size < total_size:
recv_data = client.recv(1024)
res += recv_data
recv_size += len(recv_data)
print(res.decode("gbk"))
# print("来自服务器的消息:",msg.decode("gbk"))
client.close()
server.py
</>复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/04/20 14:51
# @Author : MJay_Lee
# @File : Sever.py
# @Contact : limengjiejj@hotmail.com
import socket
import subprocess
import json
import struct
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8080))
server.listen(5)
print("start...")
# 循环连接
while True:
conn,client_addr = server.accept()
print(client_addr,"接入服务器")
while True:
try:
msg = conn.recv(1024)
print("来自客户端的消息:", msg.decode("utf-8"))
obj = subprocess.Popen(msg.decode("utf-8"),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
obj_stdout = obj.stdout.read()
obj_stderr = obj.stderr.read()
obj_len = len(obj_stdout) + len(obj_stderr)
header_dic = {
"header_len":obj_len
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode("utf-8")
# 先发送报头长度
header_size = len(header_bytes)
conn.send(struct.pack("i",header_size))
# 发送报头
conn.send(header_bytes)
conn.send(obj_stdout)
conn.send(obj_stderr)
# conn.send(msg+b"_accept")
except ConnectionResetError:
print(client_addr,"客户端中止链接")
break
conn.close()
server.close()
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41555.html
摘要:其中,厦门市大数据安全开放平台作为全国首个采用安全屋技术开展政务大数据安全开放应用的平台,一经上线就吸引了大家的关注,年厦门在全国率先实现政务数据互联互通无障碍共享,为政务大数据开放奠定坚实的基础。作为今年新晋的五大生产要素之一,数据的地位正在蹭蹭上涨,跻身新家族,自然要凭实力说话,数据也肩负着目标KPI:虽然只有短短三句,但推进起来可不是那么容易,今天咱们就来谈谈数据开放共享这件事。在种类...
摘要:拷贝目录的话,是拷贝目录里头的文件,不包括目录本身原样拷贝,不支持远程文件设置指令只能存在一个,多个的话,执行最后的那一个。设置镜像的元属性指定被其他镜像作为基础镜像时运行的操作指令指定确保服务出现任何问题而意外结束时,自动重新启动。 pause docker pause可以暂时停止容器,以释放一部分CPU出来给其他服务使用docker unpause可以解冻 docker stop ...
摘要:最近手头上做了一个很大的后台管理项目,前端对复杂数据的处理要求颇高,也确实让自己发现了很多之前被忽视的细节。鸣人佐助卡卡西佐助佐助佐助但是很遗憾及更早版本也不支持。 最近手头上做了一个很大的后台管理项目,前端对复杂数据的处理要求颇高,也确实让自己发现了很多之前被忽视的细节。在此特整理出来,希望不熟悉的朋友们们以后可以绕开我踩的这些坑。本文初衷在于帮助大家梳理一些数组操作上的重点和易...
摘要:与比较中与比较关键字用来在函数或其他局部作用域中使用全局变量。亲自动手试后,发现使用了只会读闭包内的变量,可以隔着多层上一哥们类比看作为步骤 这篇文章是抄抄写写得来的,纯粹是这个编辑器比笔记的好太多,才在这儿写。 函数参数传递 Python的函数参数传递 对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作,用C++的方式理解,就是对void*赋值。如...
摘要:文章目录前言一丶野指针指针的运算指针整数指针指针指针的关系运算二字符指针三指针数组与数组指针指针数组数组指针四数组名与数组名五数组参数指针参数一维数组传参二维数组传参一级指针传参二级指针传参六丶函数指针函数指针即指 ...
阅读 2804·2023-04-25 19:13
阅读 4237·2021-09-22 15:34
阅读 3135·2019-08-30 14:23
阅读 1536·2019-08-29 17:17
阅读 1721·2019-08-29 16:05
阅读 1616·2019-08-29 13:26
阅读 1297·2019-08-29 13:19
阅读 636·2019-08-29 13:16