首页 > 解决方案 > 如何创建多处理套接字服务器?

问题描述

我正在为我正在构建的这个机器人开发一个套接字服务器。我的想法是让多个客户处理某些任务。一名观察员、一名计算器和一名交易员。我希望这些通过创建套接字服务器来相互通信。

我正在为客户端使用多处理,因为有些将使用阻塞代码。我创建了一个简单的服务器函数和一个客户端对象。当我单独运行它们时它们运行良好,但当我从主脚本运行它们时就不行了。如果你们中的任何人都可以看一看,那就太好了!

提前感谢<3

马丁

    #server 
    import socket

    class Server:
        def __init__(self, host, port, listen):
            self.addr = (host, port)
            self.listen = listen

        def start(self):
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.s.bind(self.addr)
            self.s.listen(self.listen)
            print('Listening..')

        def main(self):
            self.start()
            
            conn, addr = self.s.accept()
            print('Connected with ' + addr[0] + ':' + str(addr[1]))
            msg_received = 0

            while True:
                data = conn.recv(1024)
                if not data:
                    break;
                msg_received += 1
                print(msg_received)
            s.close()

    if __name__ == '__main__':
        server = Server('localhost',8008, 1)
        server.main()
      #client
    import socket
    import time

    class Client:
        def __init__(self, host, port):
            self.addr = (host, port)

        def main(self):
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.s.connect(self.addr)
            print('Connected to host!')
            msg = b'koekjes'

            while True:
                time.sleep(1)
                self.s.send(msg)
                print('Sent cookies!')
            self.s.close()

    if __name__ == '__main__':
        c = Client('localhost', 8008)
        c.main()
    #main-script
    from multiprocessing import Process

    from server import Server
    from client import Client

    if __name__ == '__main__':
        s = Server('localhost', 8007, 1)
        c = Client('localhost', 8007)
        try:
            print('creating process')
            Process(target=s.main, daemon=True).start()
            Process(target=c.main, daemon=True).start()
        except Exception as e:
            print('\n' + e + '\n')
            c.stop()
            s.stop()

标签: python-3.xpython-multiprocessingpython-sockets

解决方案


我可以通过使用以下问题中的示例来弄清楚:ZeroMQ hangs in a python multiprocessing class/object solution

此代码完美运行:

from multiprocessing import Process
import socket
import time


class Base(Process):
    """
    Inherit from Process
    """
    def __init__(self, host, port):
        super().__init__()
        self.address = (host, port)
        

class Server(Base):   
    def run(self):
        print('running server')
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind(self.address)
        self.s.listen(1)
        print('listening..')
        conn, addr = self.s.accept()
        msg_received = 0

        while True:
            data = conn.recv(1024)
            if not data:
                break;
            msg_received +=1
            print(msg_received)
        self.s.close()
        


class Client(Base):
    def run(self):
        print('running client')
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.connect(self.address)
        msg = b'cookies'

        while True:
            time.sleep(1)
            self.s.send(msg)
            print('Sent cookies!')
        self.s.close()


if __name__ == "__main__":
    host = 'localhost'
    port = 8008
    
    s = Server(host, port)
    c = Client(host, port)
    print('both objects created')
    s.start()
    c.start()

推荐阅读