【问题标题】:SocketServer bind multiple serverSocketServer 绑定多个服务器
【发布时间】:2014-05-26 15:54:21
【问题描述】:

我正在尝试使用 python 的 SocketServer 模块绑定多个服务器:

import SocketServer
from SocketServer import BaseRequestHandler

class HTTPSERVER(BaseRequestHandler):

    def handle(self):
        rec = self.request.recv(1024)
        if rec:
           self.request.send('Got something!')

launchme = SocketServer.TCPServer(('', 82),HTTPSERVER)
launchme2 = SocketServer.TCPServer(('', 81),HTTPSERVER)
launchme3 = SocketServer.TCPServer(('', 80),HTTPSERVER)
launchme.serve_forever()
print 'reached first server'
launchme2.serve_forever()
print 'reached second server'
launchme3.serve_forever()
print 'reached third server'

当这个脚本启动时,什么都不会打印,但所有 3 个端口实际上都是打开的:

root@user:/# netstat -pna|more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2751/python     
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      2751/python     
tcp        0      0 0.0.0.0:82              0.0.0.0:*               LISTEN      2751/python    

但是这个脚本只服务于“得到了一些东西!”当在端口 82 上发出请求时(第一次绑定)。 SocketServer 模块让所有端口工作的正确方法是什么?

【问题讨论】:

  • Serve_forever 不会返回。在一个线程中运行每一个。
  • 当您调用serve_forever() 时,它将无限期地运行并且不会恢复脚本的执行。检查这个其他答案stackoverflow.com/questions/268629/…

标签: python python-2.7 socketserver


【解决方案1】:

server_forever 处理请求直到明确的 shutdown() 请求。

一旦launchme.serve_forever() 被调用,下一个将不会被调用。您需要在线程或单独的进程中调用它们。

import SocketServer
from SocketServer import BaseRequestHandler
import threading

class HTTPSERVER(BaseRequestHandler):

    def handle(self):
        rec = self.request.recv(1024)
        if rec:
           self.request.send('Got something!')

launchme = SocketServer.TCPServer(('', 82),HTTPSERVER)
launchme2 = SocketServer.TCPServer(('', 81),HTTPSERVER)
launchme3 = SocketServer.TCPServer(('', 80),HTTPSERVER)
t1 = threading.Thread(target=launchme.serve_forever)
t2 = threading.Thread(target=launchme2.serve_forever)
t3 = threading.Thread(target=launchme3.serve_forever)
for t in t1, t2, t3: t.start()
for t in t1, t2, t3: t.join()

【讨论】:

    【解决方案2】:

    我也在尝试做同样的事情,socketserver 文档在描述 BaseServer 类的 fileno() 方法时也提到了 selectors 包来实现这个目标(如果我理解正确的话) :

    返回服务器正在侦听的套接字的整数文件描述符。此函数最常传递给selectors,以允许监控同一进程中的多个服务器。

    但是,我已经尝试了几个小时,但我无法通过这种方法获得工作代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      相关资源
      最近更新 更多