13

「Header:Message」の形式でクライアントにデータを送信することを目的としたサーバーをPythonで作成しました

クライアントが「ヘッダー」と「メッセージ」を読むために最小限の作業を実行する必要があるように、各メッセージを個別に送信できるようにしたいと思います。

残念ながら、Pythonソケットを適切にフラッシュする方法がわからないため、複数の送信をすばやく連続して実行すると、メッセージがソケットバッファーにまとめられ、1つの大きなチャンクとして送信されます。

例:

サーバーは送信します...

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

クライアントが受信します..."header1:message1header2:message2header3:message3"

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

header1:message1
header2:message2
header3:message3

送信するたびにフラッシュする方法が必要です

4

3 に答える 3

24

TCP接続で話していると思います。

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

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

明確にするために:

通常、送信バッファーをフラッシュすると、期待どおりに新しいパッケージが作成されます。クライアントがこれらのパッケージを十分に高速に読み取る場合、読み取りごとに 1 つのメッセージを受け取る場合があります。

ここで、衛星リンクを介して通信することを想像してください。帯域幅と遅延が大きいため、sat の前の最後のルーターは、十分なデータがバッファーに格納されるまで短時間待機し、すべてのパケットを一度に送信します。クライアントは遅延なくすべてのパケットを受信し、すべてのデータを一度に受信バッファーに入れます。だからあなたの分離は再びなくなりました。

于 2009-10-31T20:47:32.227 に答える
1

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

たとえば、ファイルから「行」を読み取るたびに、「バッチ」で操作しています。「線」の定義は?これは、「\n」で終了する一連のバイトです。別の例: ファイルから 64KiB の「チャンク」を読み取ります。「チャンク」の定義は何ですか? 毎回 65536 バイトを読み取るためです。可変長の「チャンク」が必要ですか? 「チャンク」にそのサイズのプレフィックスを付けてから、「チャンク」を読み取ります。「aiff」ファイル (その実装は MS Windows の .wav および .avi ファイルでもあります) と「mov」ファイルはそのように編成されています。

これらの 3 つの方法は、媒体が何であれ、バイト ストリームを編成するための最も基本的な方法です。

  1. レコード区切り
  2. 固定サイズのレコード
  3. サイズの接頭辞が付いたレコード。

それらは混合および/または変更できます。たとえば、XML リーダーのような「可変レコード セパレータ」を使用できます。最初の '<' から最初の '>' までのバイトを読み取り、最初の '<' の後にスラッシュを追加してそれをレコードの終わりと呼び、それまでストリームを読み取ります。記録の終わり。それはただの大雑把な説明です。

メソッドを選択し、ライターとリーダーの両方に実装します。選択内容も文書化すると、最初のプロトコルを定義したことになります。

于 2009-11-01T11:42:56.513 に答える
0

\nすべてのメッセージの後に追加するだけです...

socket.send ("header1:message1\n")
socket.send ("header2:message2\n")
socket.send ("header3:message3\n")
于 2011-02-04T04:13:25.377 に答える