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 模块让所有端口正常工作的正确方法是什么?
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)
| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |