0

I.はじめに

ファイルを開いて読み取り、読み取り中に TCP ソケットを介してデータのチャンクを送信しています。

送信者コード

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

受信機コード

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

Ⅱ.問題

TCP ソケットを介してプロトコルを送信した後、送信されるバイトを表示します。それらはすべてユニークです。しかし、受信側では、受信したバイトはまったく同じ byte[] です。

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]
4

4 に答える 4

2

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

于 2010-11-22T09:05:23.820 に答える
1

たぶん、私が行ったこのテスト例は、あなたが見逃しているものを明確にするでしょう:

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();
            }
        }
    }
}
于 2010-11-22T11:18:03.780 に答える
0

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

FileTransfer に buffer パラメーターの所有権を持たせ、送信時に削除します。次に、ループを通過するたびに新しいものを割り当て、FileTransfer に渡します。

于 2010-11-22T06:23:40.043 に答える
0

out.flush()すべての情報を書いてから使用してください。

于 2010-11-22T03:41:07.040 に答える