2010-11-22 19 views
0

I.はじめにTCPファイル転送の問題

私は読んでいるときにTCPソケットを通してデータのチャンクを送信して、ファイルから開いて読み込みます。

SENDERコード

byte[] buffer = new byte[16384]; 
while ((in.read(buffer)) > 0) 
{ 
    SendProtocol(new FileTransfer(sender, receiver, buffer); 
} 

受信CODE

if(o instanceOf FileTransfer) 
    FileTransfer tf = (FileTransfer) o; 
    out.write(tf.getData); 
} 

II。問題

TCPソケットを介してプロトコルを送信した後、送信されたバイトを表示します。彼らはすべてユニークです。受信側では、受け取ったバイトはちょうど同じバイト[]です。

III。例

SENDER BYTES 
[3, 3, 5, -44, 4, 3]  
[99, -3, 5, -44, 7, 3] 
[-11, 3, 5, -44, 4, 7] 
[10, 6, 5, -44, 4, 66] 

RECEIVER BYTES 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
+0

あなた 'SendProtocol'と' FileTransfer'クラスは何ですか?彼らは標準的なJavaライブラリではありません。 –

+0

SendProtocolは、クライアントのネットワーククラスの関数であり、ソケットのすべてのTCP接続を委任します。入力ストリームと出力ストリームでプロトコルをリッスンするループ。私のFileTransferクラスは標準のJavaライブラリではなく、送信側、受信側、およびバイトを含む直列化可能クラスオブジェクトです。 (これを行うためのよりよい方法はありますか?) – user515574

答えて

0

out.flush()すべての情報を書き込んだ後。

+0

出力ストリームが終了したら 'out.close();'を忘れないでください。 – bakoyaro

+0

私はこれらの両方を行ったことを二重にチェックしたので、なぜこれが動作しないのか疑問に思う。 – user515574

0

FileTransferとは何ですか?そのコンストラクタはバッファをコピーしますか?その操作は非同期ですか?そのバッファがTCPソケットにコピーされる前にループによって再充填される可能性があります。つまり、同じバッファへのポインタをキューイングしたままにして、それをループで上書きします。

FileTransferがバッファパラメータの所有権を持ち、送信時に削除します。その後、ループごとに新しいトリップを割り当て、それをFileTransferに渡します。

+0

私はそれを試みます。プログラムとは別に私のコードを別々に走らせました。それは私の方法ですが、確かにこれを試しています。 – user515574

+0

更新:私はちょうどforloopを行い、バッファを新しいバッファにコピーして送りました。これは良い方法ですか?できます。 – user515574

2

1つの問題は、受信したバイト数をチェックしないことです。ほとんどの場合、ループバックでフルバッファを取得している可能性がありますが、実際のネットワークでこれを取得する可能性は低いです。バッファに読み込まれたバイト数を記録し、その量だけを使用する必要があります。

2

たぶん私は本試験例は、あなたが見逃している何それは明らかに:

public class Test { 
    public static void main(String args[]) throws Exception { 

     Server server = new Server(12345); 

     Socket s = null; 
     InputStream fs = null; 
     try { 
      s = new Socket("localhost", 12345); 
      fs = new FileInputStream("test.txt"); 

      OutputStream os = s.getOutputStream(); 
      byte[] bytes = new byte[1024]; 
      int read; 
      while ((read = fs.read(bytes)) != -1) 
       os.write(bytes, 0, read); 
     } 
     finally { 
      if (s != null) 
       s.close(); 
      if (fs != null) 
       fs.close(); 
     } 


     server.join(); 
    } 

    static class Server extends Thread { 

     ServerSocket serverSocket; 

     Server(int port) throws IOException { 
      serverSocket = new ServerSocket(port); 

      start(); 
     } 

     @Override 
     public void run() { 
      try { 
       Socket s = serverSocket.accept(); 

       InputStream is = s.getInputStream(); 

       try { 

        StringBuffer sb = new StringBuffer(); 
        { 
         byte[] bytes = new byte[1024]; 
         int read; 
         while ((read = is.read(bytes)) != -1) 
          sb.append(new String(bytes, 0, read)); 
        } 

        System.out.println(sb); 
       } 
       finally { 
        if (is != null) 
         is.close(); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
関連する問題