2009-05-18 13 views
3

クライアント/サーバーアプリケーション用にJavaクラスSocketChannelを使用しています。私はデータを送信して取り出すことができます。しかし、私のデータに'\n'が含まれていれば、私は正しいデータを読まない。例えば、JavaでSocketChannelを使用して 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デコードを使用しています。このタイプの問題を克服するにはどうすればいいですか?

おかげで、 ディーパック

答えて

0

私はあなたが配分にのByteBufferの問題を抱えていると思います。

私はSocketChannelで以前にデータが保持されているように見える問題がありました。私はこの問題を分離する正しい方向への一歩かもしれByteBufferの

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

にいくつかのsysoutsを行うことをお勧めします。

1

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

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

+0

チャネルがノンブロッキングモードであるかどうかを指定する必要があります。 –

+0

はい、チャネルは非ブロッキングモードです。 もう一度私の例を見てください。 – Deepak

+0

それは本当にどのようなソケットの種類に依存します。ストリームソケット(fe.、TCP)には、あなたが暗示したように、境界の保存がありません。しかしながら、データグラムソケット(すなわち、UDP)は、明確な境界で送受信されるパケットに関するものである。 –

0

データをバイナリとして送信している場合、\ nが他のバイトとは異なる扱いを受ける理由はありません。それがイメージのようなものだったならば、いつも壊れてしまうでしょう。 < = 127の文字を使用している場合は、エンコーディングで違いはありません。

あなたのアプリケーションはあなたの思うように動作していないと思います。あなたのコード。

文字列の書き込みと読み取りのためのコードを投稿できますか?つまり、文字列の終わりをどのように判断するのですか?

関連する問題