2

これは私がプレイしたコードですが、間違えるたびに再起動できません。ポート/ソケットはすでに使用されていると私に言いますそれが最初の質問です2番目の質問はMyTCPHandlerにあり、使用されているポートをどのように知ることができますか?これが私のコードです:

# MetaProject v 0.2
# -*- coding: utf-8 -*-
"""
Thanks to :
People from irc :
Flox,Luyt
People from stack Overflow :
Philippe Leybaert,Platinum Azure,methodin,Suresh Kumar,S.Lott,MatTheCat,
kevpie,Ignacio Vazquez-Abrams,adamk,Frédéric Hamidi,THC4k,THC4k,Blam
"""
import SocketServer
import threading

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024)
        socket = self.request
        print "%s wrote:" % self.client_address[0]
        print self.data
        print self.__dict__
        socket.sendto(self.data.upper(), self.client_address)


def serve_thread(host, port):
    server = SocketServer.TCPServer((host, port), MyTCPHandler)
    server.serve_forever()





if __name__ == "__main__":
    threading.Thread(target=serve_thread,args=('localhost', 1238)).start()
    threading.Thread(target=serve_thread,args=('localhost', 1237)).start()
    print "toto"

私が作った:

def serve_thread(host, port):
    if port == 1858 :
        server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True)
    elif port == 1958 :
        server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True)
    server.allow_reuse_address=True
    server.serve_forever()

しかし、それは機能しません。よろしく

4

2 に答える 2

11

実際にはそれよりも簡単です。 initをオーバーライドするのではなく、クラス変数として設定するだけです。例えば、

class MyServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    allow_reuse_address = True
于 2011-06-07T02:55:29.863 に答える
3

bind_and_activate=Trueコンストラクターへの呼び出しでSocketServer を作成します。

次に設定しserver.allow_reuse_address=Trueます。

2 つのポートを区別する場合は、要求ハンドラーに 2 つの異なるクラスを使用できます。

編集

コードを次のように変更します。

def serve_thread(host, port):
    if port == 1858 :
        server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True)
    elif port == 1958 :
        server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True)
    server.allow_reuse_address=True
    server.server_bind()
    server.server_activate()
    server.serve_forever()

独自のサーバー クラスを作成する方がクリーンな場合があります。このようなもの:

class ReuseAddrServer(SocketServer.TCPServer):
    def __init__(self, (host, port)):
        SocketServer.TCPServer.__init__(self, (host, port), bind_and_activate=False)
        self.allow_reuse_address = True
        self.server_bind()
        self.server_activate()
于 2010-10-12T01:33:44.803 に答える