3

JavaサーバーからC#クライアントにバイナリファイルを送信したい。これが私が使用しているコードです:

Javaサーバー:

    ServerSocket serverSocket = new ServerSocket(1592);
    Socket socket = serverSocket.accept();
    PrintWriter out = new PrintWriter(socket.getOutputStream(),true);

    File file = new File("img.jpg");

    //send file length
    out.println(file.length());

    //read file to buffer
    byte[] buffer = new byte[(int)file.length()];
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    dis.read(buffer, 0, buffer.length);

    //send file
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    bos.write(buffer);
    bos.flush();

    Thread.sleep(2000);

C#クライアント:

        //connect to server
        TcpClient tcpClient = new TcpClient();
        tcpClient.Connect("127.0.0.1", 1592);
        NetworkStream networkStream = tcpClient.GetStream();

        StreamReader sr = new StreamReader(networkStream);

        //read file length
        int length = int.Parse(sr.ReadLine());
        Console.WriteLine("File size: {0} bytes", length);

        //read bytes to buffer
        byte[] buffer = new byte[length];
        networkStream.Read(buffer, 0, (int)length);

        //write to file
        BinaryWriter bWrite = new BinaryWriter(File.Open("C:/img.jpg", FileMode.Create));
        bWrite.Write(buffer);

        bWrite.Flush();
        bWrite.Close();

このコードは、ファイルの最初の69696バイトのみを書き込んでいるようです。そこから最後まで0のみを書き込みます。

任意のヒント?

ありがとう

4

2 に答える 2

4

MSDNから:「読み取り操作は、サイズ パラメーターで指定されたバイト数まで、使用可能なデータをすべて読み取ります。」

つまり、要求したほど多くのデータが得られるとは限りません。期待するほど多くのデータが得られるまで、自分自身をチェックする必要があります。

int toRead = (int)length;
int read = 0;
while (toRead > 0)
{
    int noChars = networkStream.Read(buffer, read, toRead);
    read += noChars;
    toRead -= noChars;
}
于 2012-04-12T18:16:02.313 に答える
0

DataInputStream が実際に読み取ったバイト数を確認してください。割り当てた配列の長さよりも短い場合があります。

同じことがクライアントにも当てはまります。

于 2012-04-12T18:18:55.103 に答える