1

问题

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

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

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

4

2 回答 2

1

您似乎保留了两个独立的流/阅读器,它们引用同一事物:this.data_inthis.in. 从其中一个读取将推进流,然后从另一个读取将似乎“错过”在另一个中读取的数据。此外,您通过read(byte[])方法使用DataInputStream就像使用常规的旧 InputStream 一样。DataInputStream 是具有特定用途的专用流。

于 2011-07-28T00:26:40.897 回答
1

对我来说,这似乎BufferedReader是问题所在 - 根据http://ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.html的默认缓冲区大小为 8192 ......无论这个默认缓冲区大小在你的情况下,这BufferedReader将推进该data_in默认缓冲区大小的步骤......所以即使您不使用它们data_in通常位于超出您在身份验证期间使用的最后一个字节的位置。

于 2011-07-28T00:32:53.190 回答