SocketServer绑定多个服务器

n00*_*z0r 3 python socketserver python-2.7

我正在尝试使用 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'
Run Code Online (Sandbox Code Playgroud)

当此脚本启动时,不会打印任何内容,但所有 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    
Run Code Online (Sandbox Code Playgroud)

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

fal*_*tru 5

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()
Run Code Online (Sandbox Code Playgroud)