2009-10-31 9 views
9

"Header:Message"の形式でクライアントにデータを送信するためのPythonでサーバーを作成しましたどのようにPythonソケットをフラッシュしますか?

私は個々のメッセージを個別に送信して、クライアントが

残念ながら、私は適切にpythonソケットをフラッシュする方法を見つけることができないので、複数のセンドをすばやく連続して実行すると、メッセージはまとめてまとめられます1つの大きなチャンクとして送信されます。

例:

Serverが送信...

socket.send ("header1:message1") 
socket.send ("header2:message2") 
socket.send ("header3:message3") 

クライアントが受け取る... "HEADER1:message1header2:message2header3:message3"

私は3つの個別のメッセージを受け取りたい

header1:message1 
header2:message2 
header3:message3 

私はeacの後にフラッシュする方法が必要ですh send

+0

正確な複製:http://stackoverflow.com/questions/1097974/how-to-flush-a-socket-in-python – ChristopheD

+4

*重複しない*タイトルは*文字通り*重複ですが、質問は実際には機能的に異なります。 OPは以下の@eboのような答えが必要です。 –

+1

これは正しいと思われます。次回は少し遅くなります;-) – ChristopheD

答えて

19

私はあなたがTCP接続で話していると思います。

あなたのアプローチには欠陥があります。 TCPストリームは、バイトストリームとして定義されます。何らかの種類のセパレータを使用する必要があり、メッセージを分離するためにネットワークスタックに依存しない場合があります。

本当にデータグラムベースのサービスをUDPに切り替える必要がある場合は、その場合、自分で再送信を処理する必要があります。明確にするために

を送信バッファをフラッシュするには、通常、あなたが期待するのと同様に、新しいパッケージを作成します。あなたのクライアントがこれらのパッケージを十分に速く読むと、読み込みごとに1つのメッセージが得られるかもしれません。

ここで、衛星リンクを介して通信するとします。高い帯域幅とレイテンシのために、satの前の最後のルータは、十分なデータがバッファに入るまで短時間待って、すべてのパケットを一度に送信します。クライアントはすべてのパケットを遅滞なく受信し、すべてのデータを一度に受信バッファに格納します。あなたの分離は再び消えてしまいます。

+0

+1:私は、@ Jahがソケットをフラッシュしたとしても、クライアントはメッセージをまったく同じ方法で受け取ります。待ち時間の短縮という名前でバッファをクリアすること、メッセージを区切ることではないことなどです。 –

+0

これがどのように悪くなるかを示すシナリオを提示します。 thx @ stu – ebo

+0

+1:TCPはストリームです。 TCPデータのタイミングは、インターネットルーティングとTCPプロトコルによって特に排除されます。データはバッファリングする必要があります。 「フラッシング」は実際にはあまり意味がありません。つまり、あなたのデータがあなたのアプリのバッファから、そしてTCPプロトコルバッファに入っていることだけです。 –

0

あなたがしようとしていることは、データを「バッチ」に分割することです。

たとえば、ファイルから「行」を読み込むたびに「バッチ」で操作しています。 「ライン」を定義するものは何ですか? '\ n'で終わるバイト列です。もう1つの例は、64KiBの「チャンク」をファイルから読み取ることです。 「チャンク」を定義するのは何ですか?毎回65536バイトを読んでいるからです。可変長の "チャンク"が必要ですか?あなたはちょうどあなたの "チャンク"の前に接頭辞を付けて、 "チャンク"を読んでください。 "aiff"ファイル(その実装はMS Windowsの.wavと.aviファイルでもあります)と "mov"ファイルはそのように編成されています。

  1. レコードセパレータ
  2. 固定サイズのレコードをそのサイズで始まる
  3. レコードを:

    これらの3つの方法はどんなメディア、バイトの流れを整理するための最も基本的な方法です。

これらは混合および/または修飾することができる。たとえば、XMLリーダーのように "可変レコードセパレータ"を使用することができます。最初の '<'から最初の '>'までのバイトを読み取り、最初に '<'の後にスラッシュを追加し、レコードの終わり。それは単なる説明にすぎません。

メソッドを選択し、ライターとリーダーの両方で実装します。選択肢を文書化する場合は、最初のプロトコルを定義したばかりです。

3

だけ追加\ nは、すべてのメッセージ...

ようsocket.send後( "HEADER1:メッセージ1の\ nを")

socket.send( "HEADER2:メッセージ2の\ nを")

socket.send( "header3:message3 \ n")

+1

これは私のために働いた! –

+0

"\ n"はメッセージが分離されていることを保証しません。 – crey4fun

関連する問題