2013-05-08 38 views
12

Tôi đã xem tài liệu cho SocketServer. Tôi đã sao chép mã máy chủ TCP từ tài liệu và nó chạy tốt. Tuy nhiên, tôi nhận thấy rằng bất cứ khi nào tôi Ctrl-c'ed ra của chương trình trong thiết bị đầu cuối của tôi, và sau đó cố gắng chạy nó một lần nữa, tôi sẽ nhận được lỗi sau:SocketServer: loại bỏ '[Errno 98] Địa chỉ đã được sử dụng'

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

Tôi nhìn vào cách để khắc phục vấn đề bằng cách đọc thisthis. Tôi đã thêm dòng sau vào mã của mình để cố gắng cho phép sử dụng lại địa chỉ:

server.allow_reuse_address = True 

Tôi vẫn gặp sự cố tương tự ngay cả với dòng trên đã thêm. Tôi cũng đã thêm một số tryexcept xung quanh chức năng server.serve_forever() của mình, bắt ngoại lệ KeyboardInterrupt và gọi server.shutdown()server.socket.close() với hy vọng rằng địa chỉ đó sẽ được giải phóng.

Đây là mức độ đầy đủ của mã máy chủ TCP của tôi (Lưu ý: Tôi loại trừ lớp MyTCPHandler):

if __name__ == "__main__": 
    HOST, PORT = '', 9999 

    # Create the server, binding to localhost on port 9999 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    server.allow_reuse_address = True 

    # Activate the server; this will keep running until you 
    # interrupt the program with Ctrl-C 
    try: 
     server.serve_forever() 
    except KeyboardInterrupt: 
     server.shutdown() 
     server.socket.close() 

tôi vẫn nhận được lỗi chạy đoạn code trên và phải chờ gần một phút cho đến khi địa chỉ cuối cùng cũng được giải phóng. Điều này thật khó chịu khi tôi gỡ lỗi và thay đổi mã của mình liên tục.

Tôi đang chạy mã này bằng Python 2.7.3 trên RaspberryPi chạy Raspbian "Wheezy" 7.0.

Trả lời

18
... 
SocketServer.TCPServer.allow_reuse_address = True 
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
... 

allow_reuse_address phải ở trong lớp học, không phải trên trường hợp.

+0

Điều đó đã hiệu quả. Cảm ơn! –

Các vấn đề liên quan