2011-03-03 4 views
1

私のアプリで問題が発生しました。私はip = 192.168.0.3とport = 502のソケットから読み取りました。もう一つのプログラムは、そのポートフラグメントにメッセージを書き込みます(mac fragmnetの長さは205バイトです)。フラグメントごとにそのメッセージフラグメントを読む必要があります。しかし、私がこれを書いたとき、私はすべての断片を一つにまとめました。ソケット入力ストリームがフラグメント単位でフラグメントを読み取らない

boolean last=false; 
       int numberFragment=0; 
       while (((!last)) ) { 

        numberReceived = socketInputStream.read(buffer); 
        numberFragment++; 
        tempBuffer = new byte[numberReceived]; 
        ByteBuffer baferce = ByteBuffer.wrap(tempBuffer); 
        baferce.put(buffer, 0, numberReceived); 
        //System.out.println("RECEIVED="+(new String(tempBuffer))); 
        last=ResponseFragmentCheck.IsLastFragment(tempBuffer, numberFragment); 
        System.out.println("LAST ="+last); 

        PrintBytesArray(tempBuffer); 
        received.add(tempBuffer); 
       } 

断片化されたフラグメントを読み取る方法はありますか?

答えて

3

あなたはJavaがフラグメントによってフラグメントを読みたい場合は、あなたがしなければならない二つのものがあります。

  1. 利用UDP、TCPではないが。あなたはすでにこれをやっているかもしれません。
  2. を使用してDatagramPacketを受信します。

いずれのストリーム方法も、フラグメント境界を遵守することができません。

-1

TCPを使用している場合は、1つのフラグメントを書き込んだ後に、他のプログラムがflush()(または他の言語では同等のもの)を呼び出すようにしてください。さもなければ、あなたの断片は送信TCPスタックによって集められるでしょう、十分なデータが1つのTCPパケットを埋めるためにあります(実装と多分いくつかの設定による)。

もちろん、パケット/フラグメントを1つずつ受け取ることはできませんが、できるだけ早く確実に受信してください。

パケット構造が必要な場合は、TCPの代わりに別のプロトコルを使用するか、パケットの開始時と終了時に表示されるTCP over protocolを使用します。

+0

書き込みは、バッファの充填、タイマの満了、保留中のACKの受信を含む複雑な条件セットが成立するまで収集されます。また、flushing()では、送信されたのと同じ量でデータが受信されることはありません。これはバイトストリームです。 – EJP

+0

ソケットにflush()を使用しているどの言語/ APIを使用していますか? – Andrew

2

TCPには「フラグメント」はありません。これはバイトストリームです。特定の長さのメッセージを読み取る場合は、DataInputStream.readFully()を使用します。送信したのと同じ方法でメッセージを読みたい場合は、それぞれに長さの単語を接頭辞として付けるか、型長値プロトコルを使用するか、XMLなどの自己記述プロトコルを使用する必要があります。

関連する問題