python之路---socketserver模块

通过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()

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/82382276