开发者

Shutting down gracefully from ThreadingTCPServer

开发者 https://www.devze.com 2023-01-05 13:15 出处:网络
I\'ve created a simple test app (Python 2.6.1) that runs a ThreadingTCPServer, based on the example here.If the client sends a command \"bye\" I want to shut down the server an开发者_C百科d exit clean

I've created a simple test app (Python 2.6.1) that runs a ThreadingTCPServer, based on the example here. If the client sends a command "bye" I want to shut down the server an开发者_C百科d exit cleanly from the application. The exit part works OK, but when I try to re-run the app, I get:

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

I tried the solution given here for setting the socket options but that didn't seem to help. I've tried various ways to close the server down, but always get the same error.

Any idea what I'm doing wrong?

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.")


If you have not already found an answer, I believe this may assist...

How to close a socket left open by a killed program?

However, this is the same solution offered by Alex, so perhaps this is just an opportunity to close an old question.

0

精彩评论

暂无评论...
验证码 换一张
取 消