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)
基本上,我有这个代码。我试着监听两个端口:1433和9999。但是,这似乎行不通。
如何在同一个python脚本中监听两个端口??
到目前为止,代码还不错(除了1的积压似乎过于严格之外),问题当然会出现在您尝试在任一侦听套接字上
accept
连接时,因为accept
通常是一个阻塞调用(而“polling”通过尝试在任一套接字上交替接受短超时将机器周期烧成no目标明确)。select去营救!-)
select.select
(或者在更好的OSs上select.poll
,甚至select.epoll
或select.kqueue
。。。但是,好的老select.select
到处都有用!-)将让您知道哪个套接字已准备好,以及何时准备好,以便您可以适当地accept
。沿着这些思路,asyncore
和asynchat
提供了更多的组织(当然,第三方框架twisted
添加了这样一个“异步”功能的lot)。或者,可以使用单独的线程来为两个侦听套接字提供服务,但在这种情况下,如果不同套接字的功能需要影响相同的共享数据结构,则协调(锁定&c)可能会变得棘手。我当然建议首先尝试异步方法——它实际上更简单,而且提供了获得更高性能的潜力!-)
如果您想使用Python std lib,最好的方法是将SocketServer与ThreadingMixin结合使用——尽管“select”建议可能更有效。
即使我们只定义了一个ThreadedTCPRequestHandler,您也可以很容易地重新调整它的用途,使每个侦听器都有自己独特的处理程序,如果您喜欢这样的话,将服务器/线程创建包装成一个方法应该相当简单。
相关问题 更多 >
编程相关推荐