gpt4 book ai didi

java - ServerSocket 文件传输丢失字节

转载 作者:行者123 更新时间:2023-11-30 05:00:34 26 4
gpt4 key购买 nike

问题

我已经通过数据包嗅探器确认来自客户端的所有数据都已完全发送,并且服务器接收到的数据也完整,但是有一个小问题。

这是服务器内客户端线程相关部分的基本表示。

this.data_in = new DataInputStream(sock.getInputStream());
this.in = new InputStreamReader(this.data_in);

服务器将使用 BufferedReader 读取身份验证数据,一旦身份验证完成,它将从套接字读取数据,如下所示。变量“fos”是 DataInputStream 数据正在写入的 FileOutputStream。

int read = 0;
byte[] buffer = new byte[8192];
while((read = data_in.read(buffer)) != -1) {
fos.write(buffer, 0, read);
bytes_received += read;
}

这一切在概念上似乎都是正确的,但实际上,读入的文件的前 1450 个字节丢失了。我尝试使用新的 DataInputStream(sock.getInputStream()) 以防流中的位置很奇怪,但仍然没有运气。感谢您的帮助!

更新 1

所以我可以使用 BufferedReader 功能,我创建了一种方法来读取字符串行,就像我之前使用它们一样。请参阅下面的代码。

int input;
boolean run = true;
while((input = in.read()) != -1 && run) {
run = true;
char[] chars = Character.toChars(input);
for(char c : chars) {
if(c == '\n') {
run = false;
break;
} else if(c != '\r') {
sb.append(c);
}
}
}

虽然解决方案看起来很棒,但仍然缺少 1450 字节的信息。也许我在这里走错了方向?

最佳答案

对我来说,问题似乎是 BufferedReader - 根据http://ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.html默认缓冲区大小为 8192...无论您的情况是多少,BufferedReader 都会以该默认缓冲区大小为步长推进 data_in...因此,即使您不使用它们,data_in 通常也会位于您在身份验证期间消耗的最后一个字节之外的位置。

关于java - ServerSocket 文件传输丢失字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852817/

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