为什么套接字只发送1kb(425b)的数据?

xwmevbvl  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(295)

我正在学习套接字,现在我想写文件传输程序。我有服务器部分和客户端部分。服务器部分包含2个端口:5000(命令)和5001(文件)。现在我想通过套接字发送一个文件,当我做了一些错误的事情,因为只有425b的数据正在发送。
以下是客户端发送方法:

private void sendFile(Socket socket) {
    File file2 = new File("C:\\Users\\barte\\Desktop\\dos.png");
    byte[] bytes = new byte[16 * 1024];
    System.out.println(file2.exists());
    try (InputStream inputStream = new FileInputStream(file2);
        OutputStream outputStream = socket.getOutputStream();
        OutputStream secondOutput = new FileOutputStream("C:\\Users\\barte\\Desktop\\received\\dos.png")) {
        int count;
        while ((count = inputStream.read(bytes)) > 0) {
            outputStream.write(bytes, 0, count);
            secondOutput.write(bytes, 0, count);
        }
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如您所见(下图),我也在本地编写这个文件,一切正常,所有73kb的数据都被写入。
现在,在服务器端,我正在尝试接收以下文件:

case SEND: {
   new Thread(() -> {
     printWriter.println("Server is receiving files right now...");
     try (ServerSocket serverSocket = new ServerSocket(5001)) {
       while (true) {
        new FilesTransfer(serverSocket.accept()).start();
       }
     } catch (IOException e) {
        e.printStackTrace();
     }
     }).start();
     break;
   }

和内部文件传输运行方法:

@Override
public void run() {
    System.out.println("Hello there");
    try {
        InputStream inputStream = inSocket.getInputStream();
        OutputStream outputStream = new FileOutputStream("C:\\Users\\barte\\Desktop\\received\\file");
        byte[] bytes = new byte[16 * 1024];
        int count;
        while ((count = inputStream.read()) > 0) {
            outputStream.write(bytes, 0, count);
        }
        outputStream.close();
        inputStream.close();
        inSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

虫子在哪里?为什么在本地一切正常的情况下只发送空字节?

1zmg4dgp

1zmg4dgp1#

你可以这样做:

@Override
public void run() {
    System.out.println("Hello there");
    try {
        InputStream inputStream = inSocket.getInputStream();
        OutputStream outputStream = new FileOutputStream("C:\\Users\\barte\\Desktop\\received\\file");
        byte[] bytes = new byte[16 * 1024];
        int byteRead= 1;
        while (byteRead > -1) {
            byteRead= inputStream.read();
            outputStream.write(byteRead);
        }
        outputStream.close();
        inputStream.close();
        inSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

实际上,文件结尾或eof的意思是-1,而您的值大于0,所以取0,它停止了保存文件的连接。
我还建议编写一个逻辑,将文件名作为命令传输到服务器,以便以正确的名称和扩展名保存文件!

bjg7j2ky

bjg7j2ky2#

问题是:

while ((count = inputStream.read()) > 0) {

您的代码使用 InputStream.read() ,读取单个字节(或 -1 当流结束时)。现在,您正在读取单个字节,将其解释为长度,然后从中写入0x00字节数 bytes 到文件。当从流中读取0x00字节时,此操作停止。
你需要把这个改成 InputStream.read(byte[]) :

while ((count = inputStream.read(bytes)) != -1) {

也就是说,你必须通过 bytes ,并检查结果是否不等于 -1 ,如果大于零,则不是( 0 ),尽管 read(byte[]) 只会回来 0 如果传入的字节数组长度为零,则这不是真正的问题。

相关问题