• python socketserver实现客户端多并发


    直接看代码

    server

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import socketserver
    import subprocess
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            print("got connection from",self.client_address)
            while True:
                conn = self.request
                data = conn.recv(1024)
                if not data:break
                print (str(data,'utf8'))
                cmd = str(data,'utf8')
                cmd_call = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
                cmd_result = cmd_call.stdout.read()
                if len(cmd_result) == '0':
                    cmd_result = b'no output'
                ack_msg = bytes("CMD_RESULT_SIZE|%s" %len(cmd_result),'utf8')
                conn.send(ack_msg)
                client_ack = conn.recv(50)
                if client_ack.decode() == 'CLIENT_READY_TO_RECV':
                    conn.send(cmd_result)
    
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('localhost',8091),MyServer)
        server.serve_forever()

    client

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import socket
    ip_port = ('localhost',8091)
    sk = socket.socket()
    sk.connect(ip_port)
    print ("客户端启动:")
    
    while True:
        user_input = input("cmd:").strip()
        if len(user_input) == 0:continue
        if user_input == 'q':break
        sk.send(bytes(user_input,'utf8'))
        #ack_msg = b"CMD_RESULT_SIZE|%s" % len(cmd_result)
        server_ack_msg = sk.recv(100)
        cmd_res_msg = str(server_ack_msg.decode()).split("|")
        print("server response:",cmd_res_msg)
        if cmd_res_msg[0] =="CMD_RESULT_SIZE":
          cmd_res_size = int(cmd_res_msg[1])
    
          sk.send(b"CLIENT_READY_TO_RECV")
        res = ''
        received_size = 0
        while received_size < cmd_res_size:
          data = sk.recv(500)
          received_size += len(data)
          res += str(data.decode())
        else:
          print(str(res))
          print('-------recv done----')
    sk.close()
  • 相关阅读:
    redis缓存数据
    VMware克隆服务器
    Java去掉Html标签的方法
    设计模式学习笔记:一、代理模式(动态代理实现)
    设计模式学习笔记:一、代理模式(动态代理步骤+举例)
    Python教程资源
    Lucene入门
    Oracle入门
    Sql入门
    将web工程署到Linux简单实现
  • 原文地址:https://www.cnblogs.com/yexiaochong/p/5553168.html
Copyright © 2020-2023  润新知