2011-08-15 5 views
3

私はソケットと一緒に苦労してOKの進歩を遂げましたが、私は問題にぶち込まれ続けています。サーバがリスニングのために、クライアントに戻ってデータをエコー、無限ループで実行さソケットを介した複数の順次通信の正しい手順は何ですか?

  • は、それは通常、TCPクライアントとサーバを実装そこのチュートリアルがたくさんあります。

  • クライアントはサーバーに接続し、メッセージを送信し、同じものを受信して​​からを返してから、を終了します。

私はそれを扱うことができます。しかし、同じ2つのマシン/プロセス間の順次通信では、何をすべきか、またはすべきではないかの詳細に誰も触れていないようです。

機能の一般的なシーケンスは、複数のメッセージを行うために呼び出しますが、実際の質問をするために、ここにいくつかの制約がある後に私は:

  • 各イベントは、単一のメッセージになりますクライアント - >サーバー、および単一の文字列応答です。
  • メッセージはかなり短く、たとえば100文字以下です。
  • イベントは、5秒ごとに1というほど、比較的遅く発生しますが、通常はその半分以下です。

といくつかの具体的な質問:

  1. サーバが応答した後、接続を閉じる、または次の通信までの接続にハングアップしようとしているべきか?
  2. 同様に、クライアントは応答を受信した後に接続を閉じるか、接続を再利用しようとしますか?
  3. 閉じた接続(close()または何らかのエラーを通して)は、通信の終了またはオブジェクト全体の寿命の終了を意味しますか?
    1. もう一度接続してオブジェクトを再利用できますか?
    2. 私はサーバーの同じポートでこれを行うことはできますか?
    3. または、socket.socket()への新しい呼び出しで別のソケットオブジェクトを再インスタンス化していますか?
  4. 「アドレス使用中」エラーを回避するにはどうすればよいですか?
  5. recv()がタイムアウトした場合、ソケットは再利用可能ですか、それとも放棄すべきですか?繰り返しますが、同じソケットオブジェクトで新しい接続を開始できますか、まったく新しいソケットが必要ですか?

答えて

2
  1. あなたはすぐに再び二つのプロセス間で通信することがわかっている場合は、接続を閉じるための必要はありません。サーバーが他の接続も処理しなければならない場合は、それをマルチスレッドにしたいと考えています。
  2. 同じです。どちらも同じことをしなければならないことは知っていますよね?
  3. クライアントで新しいソケットを作成する必要があります。サーバー側でソケットを再利用することもできません。次の(clientsocket, address) = serversocket.accept()呼び出しで返された新しいソケットを使用する必要があります。同じポートを使用できます。 (閉じたり、閉じていない)どちらの場合も

(数千のクライアントから、彼らは常に同じポートへの接続を受け入れ、Webサーバを考えて)、あなたはしかし、たとえば\nためのメッセージ終端記号を、持っている必要があります。その後、あなたがサインに達するまで、ソケットから読み取らなければなりません。この使用法は、Pythonはそのための構築物を持っているので、一般的です:socket.makefilefile.readline

UPDATE:

  1. 郵便番号。接続を正しく閉じていない可能性があります。
  2. recv()をもう一度呼び出すことができます。

更新2: 接続が信頼できるとは決して考えないでください。エラーが発生した場合に再接続するメカニズムが含まれています。したがって、ギャップが長くても同じ接続を使用するようにしても構いません。 エラーの場合:コードに特定のヘルプが必要な場合は、小さな(しかし完全な)例を投稿する必要があります。

+0

2つのアプリケーションが同じ接続を数時間使用するのは現実的です。メッセージのギャップは1分以内ですか?このようなコミュニケーションは信頼できるものなのでしょうか、それとも頻繁に中断したりクリーンアップされたりしますか? 3.については、私は再接続する限り、クライアントで同じソケットを再利用できると言っていますか?私は、接続が落ちた後、再接続の準備のために 'settimeout()'しようとするたびに、ソケットが閉じられているのでJavaの例外(私はJythonを使用しています)を取得します。それが、私が失敗後に新しいソケットをすべて手に入れなければならないかもしれないと思った理由です。回答の一部が間違っていた。 –

+0

新しいソケットを作成する必要があります。 – xubuntix

+0

ああ、接続がなくなるときはいつも、 'self.socket = socket.socket()'と**再接続しているはずです。私は同じソケットで再接続しようとしていましたが、これはおそらく私が間違っていたところです。私はこれについて言及したチュートリアル、または**クライアント**側で複数の接続を処理する方法については何も知りません。私はコードを少し再構築し、まだ問題が残っていれば戻ってきます。今のところ私はこれに答えていると思います:) –

関連する問題