Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:多SocketServer同时工作_Python_Serversocket - Fatal编程技术网

python:多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

我想在一个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
        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.')