2017-10-11 16 views
2

私はJava NIOを使用しています。プレーヤーにメッセージを送信してからすぐに別のメッセージを送信したいと思います。2つのストレートセンドの分離方法は?

は、だから、僕は行の2つのメッセージを送信しています:

client.read(buffer) 

だからバッファは次のようになります:

message1+message2 

​​

クライアントがメッセージを受信しますクライアントに2つのメッセージを表示させたいのですが、 問題はストリームに2回書き込むことですクライアントはストリームを一度に読み込み、1つのメッセージのようにすべてのデータ(2つのメッセージ)を取得します。

ストリームが空であることを確認する方法はありますか?空の場合にのみ、2番目のメッセージを書き込む方法はありますか?

+0

改行文字などでメッセージを区切り、1行ずつ読み上げます。 – teppic

+0

しかし、私は "socketchannel.read"メソッドを使用すると、すべてのストリームを読み込みますか?どうすればそれを制限できますか? – likesLowLevel

+0

メッセージ内のバイト数を含む各メッセージの前にヘッダーを送信します。 – teppic

答えて

2

あなたの質問には実際に多くの回答が必要です。出発点として、ネットワークプロトコルとJavaソケットプログラミングに関するドキュメントの読込みを開始する必要があります。プロトコルは、あなたが直面している問題に対処するために正確に発明されました。この時点で必要な最も簡単なプロトコルはフレーミングプロトコルです。

2人(またはそれ以上)の当事者が互いに理解できるようにするには、連続または疑似連続ストリームからの実際のメッセージを抽出して解釈できるように、基本的な共有「言語」を定義する必要があります。要するに

、遠隔当事者間の通信を実現するために必要な古典的な部品は、典型的には、次のとおり

  • 送信機、またはライター(に書き込むため、典型的にはソケット)
  • 受信機、またはリーダー(典型的には読み込みソケット - 多くの場合、バッファリングされます)
  • (フレーミングプロトコルと比較して)フレーマ:ストリームからメッセージをフレーム化します。
  • コーデック(エンコーダ+デコーダ):フレーム化されたメッセージをデコードするか、ストリームに送信または書き込むバイトとして新しいメッセージをエンコードします。
  • メッセージの種類ごとにインタープリタとハンドラの束
  • 最終的にビジネスロジックは、ハンドラまたはハンドラによってトリガされたメッセージ、コマンド、イベントをリスンするコンポーネントによって発生します。

あなたの質問に厳密に答えるには、メッセージに固定長のメッセージ長ヘッダーを追加するTCP通信を使用している場合は、フレーミングプロトコルを使用する必要があります。例えば。最初の2バイトはメッセージの長さで、その後にメッセージが続きます。 UDPを使用している場合は、フレーマーは必要ありませんが、他のメカニズムは必要ありません。

TCP/UDPとその違い、ヘッダ、ペイロード、コンテンツ、デリミタとフレーム、バッファ、インテグリティ、ハンドシェイクなどの概念から始めて、必要に応じてニーズを明確にしてください。

関連する問題