Выключение изящно от ThreadingTCPServer - PullRequest
5 голосов
/ 29 июня 2010

Я создал простое тестовое приложение (Python 2.6.1), которое запускает ThreadingTCPServer на основе примера здесь . Если клиент отправляет команду «пока», я хочу выключить сервер и выйти из приложения. Часть выхода работает нормально, но когда я пытаюсь перезапустить приложение, я получаю:

socket.error: [Errno 48] Address already in use

Я попробовал решение, данное здесь для настройки параметров сокета, но это, похоже, не помогло. Я пробовал разные способы закрыть сервер, но всегда получал одну и ту же ошибку.

Есть идеи, что я делаю не так?

import SocketServer
import socket
import sys
import threading
import time

class RequestHandler(SocketServer.BaseRequestHandler):

    def setup(self):
        print("Connection received from %s" % str(self.client_address))
        self.request.send("Welcome!\n")

    def handle(self):
        while 1:
            data = self.request.recv(1024)
            if (data.strip() == 'bye'):
                 print("Leaving server.")
                 self.finish()
                 self.server.shutdown()
                 # None of these things seem to work either
                 #time.sleep(2)
                 #del self.server.socket
                 #self.server.socket.shutdown(socket.SHUT_WR)
                 #self.server.socket.close()
                 #self.server.server_close()
                 break


    def finish(self):
        self.request.send("Goodbye!  Please come back soon.")

if __name__ == "__main__":
       server = SocketServer.ThreadingTCPServer(("localhost", 9999), RequestHandler)
       # This doesn't seem to help.
       #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
       #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
       server.serve_forever()
       print("Exiting program.")

1 Ответ

1 голос
/ 06 мая 2011

Если вы еще не нашли ответ, я думаю, что это может помочь ...

Как закрыть сокет, оставленный открытым убитой программой?

Однако это то же решение, которое предлагает Алекс, так что, возможно, это просто возможность закрыть старый вопрос.

...