ThreadingTCPServer не выходит при подключении клиента

Я запускаю простой сервер эхо-сокетов, и всякий раз, когда подключается клиент, ctrl C не выходит/завершает работу сервера. Вместо этого он «зависает» до тех пор, пока клиент не отключится от сокета. Я где-то читал, что это связано с тем, что поток остается живым даже после того, как основной поток был завершен. Как решить эту проблему?

Код Python (извините за некоторые отступы, он плохо скопировал и вставил):

import SocketServer
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import sys
import time
import socket
import os

class ThreadingTCPServer(ThreadingMixIn, TCPServer):
     pass

class RequestHandler(StreamRequestHandler):

    def handle(self):
        print str(self.client_address) + 'connected'
        data = "foo"
        while data != "":
            try:
                data = self.rfile.readline().rstrip('\n')
            except:
                self.request.close()
                print 'Socket Error'
                break
                print data
            try:
                self.wfile.write("OK\n")
            except socket.error:
                data = ""
        print 'Handler Exiting'
        self.request.close()

    def finish(self):
        print 'Client ' + str(self.client_address) + ' Disconnected'

if __name__ == '__main__':
    PORT = 80
    print 'Starting Server on port: ' + str(PORT)
    ThreadingTCPServer.allow_reuse_address = True
    server = ThreadingTCPServer(("", PORT), RequestHandler)
    try:    
        server.serve_forever()
    except KeyboardInterrupt:
        print "\nServer Terminated"
        server.shutdown()
        sys.exit()

Все ответы приветствуются, спасибо за ваше время!


person skyguy126    schedule 11.11.2015    source источник
comment
в спецификации написано, что вы не можете вызывать shutdown() из того же потока, что и serve_forever()... это потому, что shudown() устанавливает флаг, который использует server_forever(). Посмотрите на код, понять несложно github.com/python/ cpython/blob/3.9/Lib/socketserver.py Решение состоит в том, чтобы запустить serve_forever() в отдельном потоке, и тогда будет работать shutdown().   -  person Eric    schedule 31.07.2021


Ответы (1)


Попробуйте сделать это в начале вашей программы:

import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

Что он делает, так это восстанавливает значение по умолчанию для Ctrl-C (SIGINT), что означает немедленное завершение программы.

person John Zwinck    schedule 11.11.2015
comment
Я чувствую, что могу поцеловать тебя! Я вечно боролся с этой проблемой. - person Dolores; 24.07.2016