Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServerSocket文件传输缺少字节 问题_Java_Sockets_Serversocket - Fatal编程技术网

Java ServerSocket文件传输缺少字节 问题

Java ServerSocket文件传输缺少字节 问题,java,sockets,serversocket,Java,Sockets,Serversocket,我已经通过数据包嗅探器确认,来自客户端的所有数据都已完全发送,服务器接收的数据也已完成,但存在一个小问题 下面是服务器中客户端线程相关部分的基本表示 this.data_in = new DataInputStream(sock.getInputStream()); this.in = new InputStreamReader(this.data_in); 服务器将使用BufferedReader读取身份验证数据,一旦身份验证完成,它将从套接字读取数据,如下所示。变量“fos”是DataIn

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

下面是服务器中客户端线程相关部分的基本表示

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字节的信息。也许我走错方向了?

您似乎保留了两个单独的流/读卡器,它们引用相同的内容:
this.data\u in
this.in
。从其中一个读取将使流前进,然后从另一个读取将显示为“丢失”在另一个中读取的数据。此外,通过使用该方法,您可以像使用常规的旧InputStream一样使用。DataInputStream是一个具有特定用途的专用流。

在我看来,BufferedReader是个问题-根据is,它的默认缓冲区大小为8192。。。在您的情况下,无论此默认缓冲区大小是什么,
BufferedReader
都将以该默认缓冲区大小的步长推进
中的数据。。。因此,即使您不使用它们,
中的
数据\u通常位于您在身份验证过程中使用的最后一个字节之外。

听起来是最合理的答案,我将对此进行检查。为了确保我们没有发现错误的问题,请尝试直接转储
sock.getInputStream()
在不进行任何进一步处理的情况下复制到文件,并检查与预期数据结构有关的内容(身份验证信息+数据)。我刚刚测试了在InputStreamReader上使用新的打印方法可以做什么,它正在为文件开头打印正确的字节,但缺少这些字节。虽然可能但不太理想,但有没有办法从该流中获取字节(我知道它返回字符,但转换为字节是不理想的)或正确设置DataInputStream,使其在正确的位置读取?不确定-但我认为我们缺少相关的源代码,在
或中的或甚至在sock中访问数据的任何内容。。。任何其他确实访问任何的源?不,代码通过更新1中原始问题中的代码访问流,一旦身份验证完成,客户端将传输“开始编号”,其中编号是文件的文件大小(以字节为单位)。文件的字节通过
DataOutputStream
发送后立即发送。无论何时,只要访问
中的
数据,尽管它在流的下游太远,而我直接尝试继续访问位于正确位置的
中的