Python:监听两个端口

Posted

技术标签:

【中文标题】Python:监听两个端口【英文标题】:Python: Listen on two ports 【发布时间】:2011-04-08 23:26:18 【问题描述】:
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】:

如果你想使用 Python 标准库,那么最好的方法是使用带有 ThreadingMixin 的 SocketServer——尽管“选择”建议可能更有效。

即使我们只定义了一个 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)

【讨论】:

【参考方案2】:

到目前为止的代码都很好,就目前而言(除了积压 1 似乎过于严格),当您尝试在任一侦听套接字上 accept 连接时,问题当然会出现,因为 accept通常是一个阻塞调用(并且通过尝试在任一套接字上以短暂的超时时间交替接受“轮询”将消耗机器周期而没有好的目的)。

select 来救援!-) select.select(或者在更好的操作系统上select.poll 甚至select.epollselect.kqueue...但是,好老的select.select 无处不在!-) 会让你知道哪个套接字准备好了,什么时候准备好了,所以你可以适当地accept。在这些方面,asyncoreasynchat 提供了更多的组织(当然,第三方框架 twisted 添加了很多这样的“异步”功能)。

或者,您可以将单独的线程用于服务两个侦听套接字,但在这种情况下,如果不同套接字的功能需要影响相同的共享数据结构,协调(锁定和 c)可能会变得棘手。我当然会建议先尝试异步方法——它实际上更简单,并且提供了显着提高性能的潜力!-)

【讨论】:

@mRt,您在使用bind 电话时观察到什么症状?它们对于在所有可用接口上绑定两个端口似乎是正确的(当然,这就是空字符串“主机”的含义)。

以上是关于Python:监听两个端口的主要内容,如果未能解决你的问题,请参考以下文章

C#同时监听两个tcp端口

让两个 UDP 服务器监听同一个端口?

Flash 和 AIR 中的套接字编程......两个客户端,一个服务器。监听两个端口还是一个?

java 用ServerSocket监听了一个端口,在程序结束的

linux 查看哪些端口被监听

Django如何监听启动,开启另外后台线程