2011-07-28 45 views
1

问题

我已经通过从客户端来的所有数据包嗅探器确认被完全发送,由服务器接收到的数据是完整的为好,但有一个轻微问题。ServerSocket的文件传输缺失字节

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

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

回答

1

对我来说,它看起来像BufferedReader的问题 - 8192根据http://ulibgcj.sourceforge.net/javadoc/java/io/BufferedReader.html是已经默认缓冲区大小......无论这个默认的缓冲区大小为你的情况下,BufferedReader将推进data_in在默认缓冲步骤大小......所以即使你不使用它们,data_in通常位于你在认证期间消耗的最后一个字节之外的位置。

+0

听起来像是最合理的答案,我会检查它。 –

+0

查看主要问题主体中的更新。 –

+0

为了确保我们不会追查错误的问题,请尝试直接将'sock.getInputStream()'转储到文件中,而无需进一步处理,并检查您期望的数据结构(认证信息+数据)的内容。 – Yahia

1

您似乎保留了两个指向同一事物的单独的流/读取器:this.data_inthis.in。从任何一方读取都将推进该流,然后从另一方读取将看起来“错过”在另一方读取的数据。另外,通过使用read(byte[])方法,您可以像使用常规的旧InputStream一样使用DataInputStream。 DataInputStream是一个具有特定用途的专用流。