1

毎回同じ問題が発生しているテストクライアントがいくつかあります。クライアントは接続でき、最初のメッセージを送信できますが、その後、サーバーはそのクライアントへの応答を停止します。問題はs.accept()に関連していると思われますが、何が間違っているのか、またはそれを回避する方法が正確にはわかりません。

def startServer():
    host = ''
    port = 13572
    backlog = 5
    size = 1024

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host,port))
    s.listen(backlog)

    print "Close the command prompt to stop Gamelink"

    while 1:
        try:
            client, address = s.accept()
            data = client.recv(size)
            if data:
                processData(data)
                client.send("OK")
            else:
                print "Disconnecting from client at client's request"
                client.close()
        except socket.error, (value, message):
            if s:
                print "Disconnecting from client, socket issue"
                s.close()
            print "Error opening socket: " + message
            break
        except:
            print "Gamelink encountered a problem"
            break
        print "End of loop"
    client.close()
    s.close()

サーバーはローカルネットワーク経由でアクセスすることを目的としており、軽量で応答が非常に速い必要があるため、これらの要件を満たすために別の実装(スレッドベースなど)の方が適している場合はお知らせください。目的のアプリケーションはリモートゲーミングキーボードとして使用されるため、リソースの使用量を減らして高速にする必要があります。

4

1 に答える 1

0

socket直接使用してサーバーを作成するのは困難です。selectキースが言うように、またはpollまたはスレッドまたはのように、何らかの方法で接続を多重化する必要がありますfork。接続が1つだけ必要だと思うかもしれませんが、何かが中断して接続が失われた場合はどうしますか?接続が失われたことにサーバーがまだ気付いていない場合、サーバーはクライアントからの再接続の試行に応答できますか?

ネットワーキングのニーズが基本的なものである場合は、他の何かにすべてのリスニング、受け入れ、フォークを処理させることができる場合があります。プラットフォームを指定しませんが、そのようなプログラムの例はMac OSで起動され、Linuxではxinetdです。詳細はこれらのツール間で異なりますが、基本的には、いくつかの構成ファイルで、いくつかのポートで接続をリッスンするように構成します。彼らがそれを得るとき、彼らは接続のセットアップを引き受け、それから彼らはあなたのプログラムをソケットに向けて処理するので、あなたはおそらくあなたがすでに知っているすべての基本的なIOを簡単に使うことができます。exec()stdinstdoutprintsys.stdin.read()

xinitdやlaunchdのようなソリューションの問題は、新しい接続ごとに、それらがプログラムの新しいインスタンスであるfork()必要があることです。exec()これらは比較的重い操作であるため、多数の接続または高い割合の新しい接続がサーバーの制限に達する可能性があります。さらに悪いことに、各接続は別々のプロセスにあるため、それらの間でデータを共有することは困難です。また、プロセス間で通信するために見つける可能性のあるほとんどのソリューションには、ブロッキングAPIselectが含まれます。これで、スレッドなどとの多重化の問題に戻ります。

それがあなたのニーズを満たさない場合は、の道を進んだ場合に必然的に遭遇するすべての問題を処理する、より高いレベルのネットワークフレームワークを使用することを学ぶ方が良いと思いますsocket。私が提案するそのようなフレームワークの1つは、Twistedです。接続の処理に関するありふれた詳細や、接続間でIOを多重化するというより複雑なタスクを処理するだけでなく、プロトコルの実装をはるかに簡単にするツールの膨大なライブラリもあります。

于 2012-12-31T04:21:30.533 に答える