mRt*_*mRt 5 python sockets listen
import socket
backlog = 1 #Number of queues
sk_1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk_2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
local = {"port":1433}
internet = {"port":9999}
sk_1.bind (('', internet["port"]))
sk_1.listen(backlog)
sk_2.bind (('', local["port"]))
sk_2.listen(backlog)
Run Code Online (Sandbox Code Playgroud)
基本上,我有这个代码.我试图听两个端口:1433和9999.但是,这似乎不起作用.
如何在同一个python脚本中侦听两个端口?
syn*_*tel 11
如果你想使用Python std-lib,那么花哨的方法就是将SocketServer与ThreadingMixin一起使用 - 尽管'select'建议可能效率更高.
即使我们只定义了一个ThreadedTCPRequestHandler,您也可以轻松地重新调整它,使每个侦听器都拥有自己独特的处理程序,如果您喜欢这种类型的方法,将服务器/线程创建包装成单个方法应该是相当简单的.
#!/usr/bin/python
import threading
import time
import SocketServer
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "%s wrote: " % self.client_address[0]
print self.data
self.request.send(self.data.upper())
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
HOST = ''
PORT_A = 9999
PORT_B = 9876
server_A = ThreadedTCPServer((HOST, PORT_A), ThreadedTCPRequestHandler)
server_B = ThreadedTCPServer((HOST, PORT_B), ThreadedTCPRequestHandler)
server_A_thread = threading.Thread(target=server_A.serve_forever)
server_B_thread = threading.Thread(target=server_B.serve_forever)
server_A_thread.setDaemon(True)
server_B_thread.setDaemon(True)
server_A_thread.start()
server_B_thread.start()
while 1:
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
到目前为止的代码都很好,就其本身而言(除了 1 的积压似乎过于严格),当您尝试accept在任一侦听套接字上建立连接时,问题当然会出现,因为accept通常是阻塞调用(并且“轮询” “通过尝试在任一套接字上交替接受短超时,将会消耗机器周期,从而没有任何好处)。
select来救援!-) select.select(或者在更好的操作系统上,select.poll甚至select.epoll或者select.kqueue...但是,好的旧select.select作品到处都是!-)会让您知道哪个套接字准备就绪以及何时准备好,以便您可以accept适当地进行。沿着这些思路,asyncore并提供更多一点的组织(当然,asynchat第三方框架添加了很多这样的“异步”功能)。twisted
或者,您可以使用单独的线程来服务两个侦听套接字,但在这种情况下,如果不同套接字的功能需要影响相同的共享数据结构,则协调(锁定和c)可能会变得棘手。我当然建议首先尝试异步方法——它实际上更简单,并且提供了显着提高性能的潜力!-)