停止UDP SocketServer

2 投票
2 回答
1360 浏览
提问于 2025-04-17 12:15

我正在创建一个UDP Socket服务器,如果我从客户端收到一个关闭的消息,我想要关闭UDP连接。

当我收到这个消息时,Begin会显示出来,但Finished却没有显示。我该如何退出这个线程呢?

class MyUDPHandler( SocketServer.BaseRequestHandler ):       
    def handle( self ):
        data = self.request[0].strip()        
        dic = self.string_XML_to_dic( data )
        if( dic['Cmd'] == str(UDPConst().SHUT_DOWN )): 
            print('Begin')           
            self.server.shutdown()
            print("Finished")

if __name__ == "__main__": 
    HOST, PORT = "", prop['udpport']
    server = SocketServer.UDPServer( ( HOST, PORT ), MyUDPHandler )    
    server.serve_forever()

2 个回答

0
# Step 1 - Create a global object
global_object = dict()

# Step 2 - Create a function that will receive kill, Control-C signals
def stop_listener(*args): 
   global_object['listener_server'].shutdown()

# Step 3 - Assign kill, and Control-C signal to function=stop_listener
import signal
signal.signal(signal.SIGINT , stop_listener)
signal.signal(signal.SIGTERM, stop_listener)

# Step 4 - Create UDP Server in usual way, and save a reference in global_object
server = socketserver.UDPServer(...)
global_object['listener_server'] = server
server.serve_forever()

解释:

  • 当你按下Control-C键,或者发送kill命令给某个进程ID(pid)时,就会调用一个叫做stop_listener的函数。
  • 这个stop_listener函数会接着对UDPServer的引用调用shutdown方法。
  • 这样做是为了清理监听器。
0

因为你没有在自己的线程中运行服务器(你需要继承 ThreadingMixIn 才能做到这一点),所以你不能使用 shutdown,这样会导致程序卡住。根据 源代码 中的函数文档注释:

这个函数会一直等到循环结束。如果不在另一个线程中运行 serve_forever() 的时候调用它,就会导致程序卡住。

撰写回答