并发编程

并发编程

可以显示多个客户端,同时连接服务端。客户端能同时发送消息给服务器

客户端-1
import  socket
import struct
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr = ('127.0.0.1',8000)

client.connect(addr)

while True:
    # 发送消息
    # msg = input("请输入你要讲的话>>>>")
    time.sleep(2)
    msg = 'dir'
    print(msg)
    client.send(bytes(msg.encode('utf8')))

    leng = client.recv(4)
    date_lens = struct.unpack('i', leng)[0]
    # 接受消息
    leng = client.recv(date_lens)
    print(leng.decode('gbk'))
客户端-2
import  socket
import struct
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr = ('127.0.0.1',8000)

client.connect(addr)

while True:
    # 发送消息
    # msg = input("请输入你要讲的话>>>>")
    time.sleep(2)
    msg = 'dir'
    print(msg)
    client.send(bytes(msg.encode('utf8')))

    leng = client.recv(4)
    date_lens = struct.unpack('i', leng)[0]
    # 接受消息
    leng = client.recv(date_lens)
    print(leng.decode('gbk'))
客户端-3
import  socket
import struct
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr = ('127.0.0.1',8000)

client.connect(addr)

while True:
    # 发送消息
    # msg = input("请输入你要讲的话>>>>")
    time.sleep(2)
    msg = 'dir'
    print(msg)
    client.send(bytes(msg.encode('utf8')))

    leng = client.recv(4)
    date_lens = struct.unpack('i', leng)[0]
    # 接受消息
    leng = client.recv(date_lens)
    print(leng.decode('gbk'))
客户端-4
import  socket
import struct
import time
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

addr = ('127.0.0.1',8000)

client.connect(addr)

while True:
    # 发送消息
    # msg = input("请输入你要讲的话>>>>")
    time.sleep(2)
    msg = 'dir'
    print(msg)
    client.send(bytes(msg.encode('utf8')))

    leng = client.recv(4)
    date_lens = struct.unpack('i', leng)[0]
    # 接受消息
    leng = client.recv(date_lens)
    print(leng.decode('gbk'))
服务端
import  socketserver
import subprocess
import struct

class MyHandler(socketserver.BaseRequestHandler):	# 重写方法
    # 通信循环
    def handle(self):
        while True:
            # 接受消息
            client_msg = self.request.recv(1024)
            common = client_msg.decode('utf8')
            print(common)
            obj = subprocess.Popen(common,
                                   shell=True,
                                   stderr=subprocess.PIPE,
                                   stdout=subprocess.PIPE
                                   )
            stdout = obj.stdout.read()	# 拿到正常输出的信息
            stderr = obj.stderr.read()	# 拿到错误输出的信息

            msg_len = len(stderr) + len(stdout)	# 计算传输数据的长度
            one = struct.pack('i', msg_len)	#  转化
            print(one)
            self.request.send(one)
            self.request.send(stdout + stderr)


if __name__ == '__main__':
    addr = ('127.0.0.1',8000)
    service = socketserver.ThreadingTCPServer(addr,MyHandler,bind_and_activate=True)
    service.serve_forever()

当你运行服务端后,依次运行对应客户端文件,你会发现此时就是并发在处理数据。

原文地址:https://www.cnblogs.com/plf-Jack/p/11105245.html