Python,通过两个套接字进行通信

时间:2016-12-11 09:59:16

标签: python multithreading sockets

我正在开发一台不断向客户端发送数据的服务器。该客户端还可以与发送特定请求的服务器进行准时交互。我写了一个守护进程来做到这一点。请注意,此守护程序在一个线程中工作。目前,脚本的结构如下:

SELECT 
scode
FROM TABLE1 T1 
WHERE T1.scode NOT IN (
   SELECT T2.subject FROM TABLE2 T2 
)

问题在于:

  • 只使用蒸笼,一切正常。

  • 仅使用请求者,一切正常。

  • 同时使用两个插座阻挡流光。

我读到单个线程无法同时连接(或连接)到两个套接字。我还读到使用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? 将发送到子线程并将请求发送给另一个线程会不会更有效/更简单?

编辑:最后,我使用了

的子线程

2 个答案:

答案 0 :(得分:2)

使用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())

答案 1 :(得分:1)

我建议你试试gevent,简单地理解api,如果你想克服这个问题,那就很好了,有一节关于servers 了解tcp通信&重新考虑您当前的解决方案 代码快照 -

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

希望您可以花更多的时间来制作应用程序,而不需要使用毛毡。 :)