Python:监听两个端口

2024-05-15 05:38:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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脚本中监听两个端口??


Tags: 端口importnumberstreambindportlocalsocket
2条回答

到目前为止,代码还不错(除了1的积压似乎过于严格之外),问题当然会出现在您尝试在任一侦听套接字上accept连接时,因为accept通常是一个阻塞调用(而“polling”通过尝试在任一套接字上交替接受短超时将机器周期烧成no目标明确)。

select去营救!-)select.select(或者在更好的OSs上select.poll,甚至select.epollselect.kqueue。。。但是,好的老select.select到处都有用!-)将让您知道哪个套接字已准备好,以及何时准备好,以便您可以适当地accept。沿着这些思路,asyncoreasynchat提供了更多的组织(当然,第三方框架twisted添加了这样一个“异步”功能的lot)。

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

如果您想使用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)

相关问题 更多 >

    热门问题