通过socketserver模块实现套接字并发
基于TCP协议的套接字可以分为两个阶段:链接循环与通信循环,与之对应的,socketserver模块中有两个类,server类用于解决链接问题,request类用于解决通信问题
Server端
import json import struct import subprocess import socketserver class MyTCP(socketserver.BaseRequestHandler): def handle(self): # 必须拥有handle方法 print('客户端进入...', self.client_address) while True: try: data = self.request.recv(1024) if len(data) == 0: break print('来自客户端的数据>>>', data.decode('utf-8')) obj = subprocess.Popen(data.decode(), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout = obj.stdout.read() stderr = obj.stderr.read() header = {'file_name': 'cmd', 'cmd_size': len(stdout) + len(stderr)} header_json = json.dumps(header) header_bytes = header_json.encode('utf-8') header_len = struct.pack('i',len(header_bytes)) self.request.send(header_len) self.request.send(header_bytes) self.request.send(stdout) self.request.send(stderr) except ConnectionResetError: break if __name__ == '__main__': s = socketserver.ThreadingTCPServer(('127.0.0.1', 8081), MyTCP) s.serve_forever() # 建立连接 # 每建立一个连接。就产生一个线程,并实例化类产生对象,调用该对象下的handle方法,专门与刚建立好的连接进行通信循环
Client端
import json import socket import struct Tag = True client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 8081)) while Tag: to_data = input('(q退出)>>>').strip() if to_data == 'q': Tag = False continue if len(to_data) == 0: continue client.send(to_data.encode('utf-8')) obj = client.recv(4) deader_len = struct.unpack('i', obj) deader_json = client.recv(deader_len[0]) deader = json.loads(deader_json) data_len = deader['cmd_size'] data = client.recv(data_len) print(data.decode('gbk')) client.close()
python之路---socketserver模块
猜你喜欢
转载自blog.csdn.net/ltfdsy/article/details/82382276
今日推荐
周排行