python:多SocketServer同时工作
我想在一个python程序中创建3个SocketServer:python:多SocketServer同时工作,python,serversocket,Python,Serversocket,我想在一个python程序中创建3个SocketServer: import threading import SimpleHTTPServer import SocketServer class PolicyHandler(SocketServer.BaseRequestHandler): def handle(self): self.data = self.request.recv(128).strip() print self.data
import threading
import SimpleHTTPServer
import SocketServer
class PolicyHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(128).strip()
print self.data
if self.data == '<policy-file-request/>\0':
self.request.sendall('message 1')
class LiveRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.request.sendall('message 2')
def main():
httpd = SocketServer.TCPServer(('',80),\
SimpleHTTPServer.SimpleHTTPRequestHandler)
httpdThr = threading.Thread(target=httpd.serve_forever)
httpdThr.daemon = True
httpdThr.start()
liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler)
livThr = threading.Thread(target=liveServer.serve_forever)
livThr.daemon = True
livThr.start()
policyServer = SocketServer.TCPServer(('',834), PolicyHandler)
policyThr = threading.Thread(target=policyServer.serve_forever)
policyThr.daemon = True
policyThr.start()
if __name__ == '__main__':
main()
奇怪的是,它立即退出了程序,所以我的客户端程序无法运行
连接到三个套接字服务器。如何防止它退出程序?如果您真的想从同一个程序启动三台服务器,这将是一个解决方案 现在我更改代码如下:
httpd = SocketServer.TCPServer(('',80), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpdThr = threading.Thread(target=httpd.serve_forever)
httpdThr.daemon = True
httpdThr.start()
liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler)
livThr = threading.Thread(target=liveServer.serve_forever)
livThr.daemon = True
livThr.start()
policyServer = SocketServer.TCPServer(('',834), PolicyHandler)
policyThr = threading.Thread(target=policyServer.serve_forever)
policyThr.daemon = True
policyThr.start()
它很好用。但现在我不知道如何在需要时向客户端发送消息。当不再有非守护进程线程运行时,守护进程线程终止,因此它们在主线程结束时退出。添加一些东西以保持main运行,例如:
raw_input('Press enter to stop servers.')
您看过
SocketServer
文档中的吗?是的,我看过。它显示了一个SocketServer异步处理多个请求。是的,但是您可以使用相同的技术将handle\u永远
调用放在一个单独的线程中。SocketServer是否可以主动将消息发送到它的handle()方法之外的客户端?一般来说,不要使用线程来侦听多个套接字,有一个select()系统调用可以避免所有多线程问题。您应该修改您的问题,而不是添加更多信息作为答案。
raw_input('Press enter to stop servers.')