客户端:
from socket import * 调用socket模块,因为这里要用到socket大量的接口和属性,这样写可以简化代码不用加前缀
import struct 调用struct模块
import json
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8081))
# 通信循环
while True:
cmd=input('>>: ').strip()这句的用途是后面想输啥就输啥
if len(cmd) == 0:continue 这句的作用是用来防止空格传入空的数据
client.send(cmd.encode('utf-8'))
#1. 先收4bytes,解出报头的长度
header_size=struct.unpack('i',client.recv(4))[0]
#2. 再接收报头,拿到header_dic
header_bytes=client.recv(header_size)
header_json=header_bytes.decode('utf-8')
header_dic=json.loads(header_json)
print(header_dic)
total_size=header_dic['total_size']
#3. 接收真正的数据
cmd_res=b''
recv_size=0
while recv_size < total_size:
data=client.recv(1024)
recv_size+=len(data)
cmd_res+=data
print(cmd_res.decode('gbk'))转成gbk编码把字符转成中文
client.close()
服务端: # 服务端必须满足至少三点:
# 1. 绑定一个固定的ip和port
# 2. 一直对外提供服务,稳定运行
# 3. 能够支持并发
from socket import *
import subprocess
import struct
import json
server = socket(AF_INET, SOCK_STREAM)这个套接字server负责接受链接请求,建立链接 server.bind(('127.0.0.1', 8081))绑定ip和端口 server.listen(5)监听了链接请求连接池限制请求数
# 链接循环
while True:
conn, client_addr = server.accept() 形成阻塞
print(client_addr)
# 通信循环
while True:
try:
cmd = conn.recv(1024) # cmd=b'dir'(接收数据的最大限制)
if len(cmd) == 0: break # 针对linux系统
obj = subprocess.Popen(cmd.decode('utf-8'),执行系统参数,
shell=True,
stdout=subprocess.PIPE,把命令的正确和错误的结果放到管道里去
stderr=subprocess.PIPE )
stdout = obj.stdout.read()读出结果
stderr = obj.stderr.read()
# 1. 先制作报头
header_dic = { 'filename': 'a.txt', 'md5': 'asdfasdf12123x1', 'total_size': len(stdout) + len(stderr) }
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
# 2. 先发送4个bytes(包含报头的长度)
conn.send(struct.pack('i', len(header_bytes)))(i的意思是整形 ,后面的数据长度)
# 3 再发送报头
conn.send(header_bytes)
# 4. 最后发送真实的数据
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError: 这个是用来错误处理,有这个就不会报错
break
conn.close()断开链接
server.close()
数据想从客户端到服务端 先到客户端的操作系统再通过网线到服务端的操作系统,然后服务端的操作系统发信息会客户端, 客户端里的信息删除,最后服务端的操作系统在把信息传入服务端
补充struct模块 import struct import json
header_dic={ 'filename':'a.txt', 'md5':'asdfasdf123123x1', 'total_size':12312311111111111123 }
header_json=json.dumps(header_dic)
# print(header_json) header_bytes=header_json.encode('utf-8')转成utf-8格式 print(len(header_bytes))