2

サーバーが接続を受け入れていなくても、クライアント側からサーバー側へと時間をかけて継続的に試みています。クライアント側で次の関数を作成しました。

def run(self):

    print "running client"  
    start = datetime.now().second
    while True:
        try:
            host ='localhost'
            port = 5010
            time = abs(datetime.now().second-start)
            time = str(time)
            print time
            client = socket.socket()
            client.connect((host,port))
            client.send(time)

        except socket.error:
            pass 

今、私は別のクラスの中にいます。その名前はloginGuiです。スレッドを使用して上記のグローバル関数を実行し、残りのクライアントコードの実行中にクライアントがサーバー側に時間を継続的にスローするようにします。だから私はクラスloginGui内に次のコードを書きました

class loginGui:
    def run_client(self):
            thread.start_new_thread(run,())

上記の関数run_client()を呼び出すと、スレッドは実行されますが、何らかの理由でループから抜け出し、時間をスローしなくなるため、この別のアプローチを試しました。

class FuncThread(threading.Thread):

    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

上記のクラスを作成してから、run_client()関数で次の変更を行いました。

def run_client(self):

    t1 = FuncThread(run,())
    t1.start()
    t1.join()

run_client()を呼び出すと、スレッドが作成され、グローバル関数run()が呼び出されますが、問題は、whileループで発生し、時間をスローし続けることです。

結論:私が基本的に望んでいるのは、関数runを呼び出し、whileループに巻き込まれることなく時間をスローし続けるスレッドを作成することです。

4

1 に答える 1

3

最初の例では、whileループが非常に高速のチェックされていない速度で起動し、閉じられていない接続を何度も作成しています。あなたはそこにある種の制限を課す必要があります、それが睡眠であろうと、そのようなものであろうと。それらを捨てるのではなく、同じクライアントを再利用してみてください。最終的にリソースが不足するなど、他の種類の例外が発生する可能性があります。前回作成に失敗した場合にのみ、新しいクライアントの作成を試みる必要があります。別のデータを送信するたびにだけではありません。

2番目の例では、コードを実際のスレッドクラスに移動することを除いて、以前とほぼ同じことを行っていますがjoin()、スレッドが完了するまでメインスレッドでブロックするを呼び出します。

一言で言えば、問題はこのスレッドクラスを構築している場所ではなく、無駄な方法でソケット接続をどのように使用しているかにあると思います。

この例はちょっと醜いですが、それはあなたに出発点を与えると思います:

import time

def run(self):

    print "running client"  
    start = datetime.now().second
    host ='localhost'
    port = 5010

    client = None

    while True:

        if client is None:
            client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                client.connect((host,port))
            except socket.error:
                print "Connection failed. Retrying."
                client = None
                time.sleep(.25)
                continue


        time = str(abs(datetime.now().second-start))
        print time
        try:
            client.sendall(time)
        except:
            print "Send error."
            client.close()
            client = None

        time.sleep(.25)
于 2012-04-20T19:45:40.817 に答える