Python,通过两个插座进行通信



我正在连续将数据发送给客户端的服务器上工作。该客户端还可以与服务器发送特定请求的服务器进行概括。我写了一个守护程序来做到这一点。请注意,此守护程序在线程中起作用。目前,脚本的结构如下:

class MyDaemon(threading.Thread):
    def __init__(self):
        # Init Stream socket (output) 
        self.MainSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.MainSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.MainSock.bind(('', 15555))
        self.MainSock.listen(5)
        self.MainSock.setblocking(0)
        # Init Request socket (input)
        self.RequestSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.RequestSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.RequestSock.bind(('', 15556))
        self.RequestSock.listen(5)
        self.RequestSock.setblocking(0)

    def run(self):
        while True:
            # Listen to connection on MainSock
            try:
                self.stream, address = self.MainSock.accept()
            except:
                pass
            # Listen to connection on RequestSock  
            try:
                self.request, address = self.RequestSock.accept()
            except:
                pass
            if self.stream:
                send_message_continuously() # it is a stream
            if self.request:
                recv_a_message_from_client()
                do_whatever_action_the client_request()

问题是:

  • 仅使用蒸汽器,一切都很好。

  • 仅使用请求者,都可以正常工作。

  • 同时使用两个插座阻止了流媒体。

我读到一个线程不能同时连接(或连接)到两个插座。我还读到,select模块的使用可能有助于解决这类问题,但是我从未使用过,并且对它在特定情况下的使用有些丢失。

解决此问题的更有效方法是什么?在我的特殊情况下,如何设置select?将发送到子线程和请求向另一个?在

使用select时,您必须测试,您的两个插座中的哪一个已准备好:

def run(self):
    while True:
        ready, _, _ = select.select([self.MainSock, self.RequestSock],[],[])
        for sock in ready:
            if sock is self.MainSock:
                send_message_continuously(sock.accept())
            elif sock is self.RequestSock:
                recv_a_message_from_client(sock.accept())

我建议您尝试gevent,简单地将API放弃,如果您想克服问题,就可以去吧,有一个有关服务器的部分了解TCP Communication&重新考虑您当前的解决方案。
代码快照 -

def handle(socket, address):
     print('new connection!')
server = StreamServer(('127.0.0.1', 1234), handle) # creates a new server
server.start() # start accepting new connections

希望您可以在不制作Skelt的情况下花费更多的时间来制作应用程序。:)

最新更新