第三十一天笔记

客户端:

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'))      

扫描二维码关注公众号,回复: 3038182 查看本文章

#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))

猜你喜欢

转载自www.cnblogs.com/zhouhao123/p/9581486.html