2012-04-14 5 views
1

私は、サーバーが最初にファイルサイズとファイルデータを送信するケースがあります。クライアント側で読み取るときに整数値とファイルデータを区別するにはどうすればよいですか?サーバーのTCP IP内のデータパケットを区別する

Samepleコード(OSがBufferedOutputStreamがある):あなたは、すべてのファイルは、255バイト以内の長arfeと仮定されていない限り、

  // Construct a 1K buffer to hold bytes on their way to the socket. 
      byte[] mybytearray = new byte[(int) myFile.length()]; 

      //File Size 
      os.write((int) myFile.length()); 

    FileInputStream fis = null; 
    System.out.println("test+sendbytes"); 
    // Copy requested file into the socket's output stream. 
     try { 
      fis = new FileInputStream(myFile); 
     } catch (FileNotFoundException ex) { 
      // Do exception handling 
     } 
     BufferedInputStream bis = new BufferedInputStream(fis); 

     try { 
      bis.read(mybytearray, 0, mybytearray.length); 
      os.write(mybytearray, 0, mybytearray.length); 
      os.flush(); 
      os.close(); 
      os.close(); 

      // File sent, exit the main method 
      return; 
     } catch (IOException ex) { 
      // Do exception handling 
     } 
+0

'os.write((int)myFile.length())'はPeter Lawreyの答えで指摘されているように間違っています。値 'myFile.length()&0xFF'を持つ1バイトを書き込みます。また、 'os.flush()'の呼び出しは 'os.close()'の直前では不要です。 'close()'は常にコアIOクラスの残りのデータをフラッシュします。 –

答えて

1

あなたはintとして長さを記述する必要があります。試してみてください。DataOutputStream.writeInt()

お読みになるには、注文を受けなければなりません。つまり、長さが最初に送信され、その後に内容が続くと仮定します。 DataInputStream.readInt()を使用して長さを読み取ります。

+0

ありがとうピーター。私はサイズが4MBのファイルを送信しています。だから私は、変数にDatainputstream.readInt()を使用して読み取ったとき、そのintger変数に格納されますか? – DesperateLearner

+0

はい、読み取る長さが残っている 'int'フィールドです。データの一部を一度に読み取ると、これを減らすことができます。 –