gpt4 book ai didi

java - 为什么套接字仅发送1KB(425B)数据?

转载 作者:行者123 更新时间:2023-12-03 11:56:58 25 4
gpt4 key购买 nike

我正在学习套接字,现在我想编写文件传输程序。我有服务器部分和客户端部分。服务器部分包含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;
}
在FilesTransfer运行方法中:
@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();
}
}
错误在哪里?为什么在本地一切正常时只发送空字节?
enter image description here

最佳答案

问题是:

while ((count = inputStream.read()) > 0) {
您的代码使用 InputStream.read() ,它读取单个字节(或在流结束时读取 -1)。现在,您正在读取单个字节,将其解释为长度,然后从 bytes将0x00字节的数量写入文件。当您从流中读取0x00字节时,此操作停止。
您需要更改它以使用 InputStream.read(byte[]) :
while ((count = inputStream.read(bytes)) != -1) {
也就是说,您需要传入 bytes并检查结果是否等于 -1,而不是结果是否大于零( 0),尽管 read(byte[])仅在传入的字节数组的长度为零的情况下才返回 0,因此不是真正的关注。

关于java - 为什么套接字仅发送1KB(425B)数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65561669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com