3

SocketChannelクライアント/サーバー アプリケーションに Java クラスを使用しています。データを送受信できます。しかし、データに含まれている場合'\n'、正しいデータを読み取れません。例えば

sending data = "Hi dear"
receiving data = "Hi dear"

sending data = "Hi dear\n\n i am fine"
receiving data = "Hi dear"

sending data = "Hi dear\\n\\n i am fine"
receiving data = "Hi dear\n\n i am fine"


ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);

US-ASCII デコードを使用しています。この種の問題をどのように克服できますか?

ありがとう、ディーパック

4

3 に答える 3

1

読み取り操作は、SocketChannelが非ブロッキングモードの場合、使用可能なすべてのデータを読み取ることや、データをまったく読み取ることを保証するものではありません。上記の場合、送信されたすべてのデータを読み取るために複数の呼び出しが必要になる場合があります。

受信コードがすべてのデータをいつ読み取ったかを知るための何らかの方法が必要です。これは、合意されたプロトコルの一部として送信者にデータのコンテンツ(長さなど)に関する情報を送信させるか、データの1つのチャンクに対してのみチャネルを使用し、チャネルが閉じられるまで読み取ることを意味します。

于 2009-05-18T05:05:04.170 に答える
0

割り当てのByteBufferに問題があると思います。

以前、SocketChannelで問題が発生し、データが保持されているように見えました。ByteBufferでいくつかのsysoutを実行することをお勧めします

while(ByteBuffer.hasRemaining(){
    socketChannel.write(buffer) //writing data
    System.out.printline(socketChanel.remaining() + " : bytes to go");
}

これは、問題を切り分けるための正しい方向への一歩かもしれません。

于 2009-05-18T05:02:47.883 に答える
0

あなたが示唆するようにデータをバイナリとして送信している場合、 \n が他のバイトとは異なる方法で扱われる理由はありません。画像がいつも壊れてしまうようなものだったら。使用する文字が 127 以下の場合、エンコーディングは何の違いもありません。

あなたのアプリケーションはあなたが思っているように動作しておらず、コードのどこかで \n 終了を想定している文字列を読んでいることをお勧めします。

文字列を読み書きするためのコードを投稿できますか。つまり、文字列がいつ終了するかをどのように判断しますか?

于 2009-05-18T06:15:37.143 に答える