3
import SocketServer
import sys
from Queue import *
import threading

class CustomTCPServer(SocketServer.TCPServer):
    def __init__(self, server_address, RequestHandlerClass, commandQueue=Queue):
        self.queue = commandQueue
        SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=False)
        SocketServer.TCPServer.allow_reuse_address = True
        self.server_bind()
        self.server_activate()

class SingleTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        commandQueue = self.server.queue
        self.data = self.request.recv(1024).strip()
        try:
            commandQueue.put(self.data)
        except Queue.Empty:
            print 'Sorry.. Cannot accept any more.. Queue is full..'

def main():
    HOST = ''
    PORT = 50099
    commandQueue = Queue()
    server = CustomTCPServer((HOST, PORT), SingleTCPHandler, commandQueue)
    threadObject = threading.Thread(target=server.serve_forever)
        threadObject.setDaemon(True)
        threadObject.start()
    threadObject.join()

if __name__ == '__main__':
  main()

しかし、コードを 2 回目に実行するたびに、socket.error: [Errno 98] Address already in use というメッセージが表示されます。

私は混乱しています..

どんな提案もいただければ幸いです..

4

2 に答える 2

2

それ以外の:

SocketServer.TCPServer.allow_reuse_address = True

これは、すでに自分自身をサブクラス化した (およびインスタンスを作成した) 基本クラスに値を設定します。

使用する:

self.allow_reuse_address = True
于 2013-10-26T07:27:12.533 に答える
0

最後にソケットを閉じているようには見えません。を追加してserver.shutdown()(および を変更してallow_reuse_address)、スレッドの参加後に最後にシャットダウンしてみてください。

于 2013-10-26T07:32:36.823 に答える