2013-01-10 107 views
3

我正在制作一个服务器以获得64 kb大小的包。从套接字读取所有字节停留在52964字节

 int length = 65536; 
     byte[] bytes = new byte[length]; 

     int pos = 0; 
     while(pos < length -1) 
     { 
      System.out.println("Before read"); 
      pos += dis.read(bytes, pos, length-pos); 
      System.out.println(""+pos+" >> "+ length); 
     } 

这是我用来读取插座的所有字节的代码。 DisInputStream。 当我运行代码1时出错了。该代码只接收52964字节而不是65536字节。

我也检查了C代码,它说它发送65536字节。

有人知道我在做什么错吗?

+0

你有寄件方代码吗? – kmkaplan

+1

我不明白这是怎么发生的,因为你没有为EOF得到'-1',我假设。你有什么,一个例外? –

+0

您是否设置了套接字接收缓冲区的大小? – fge

回答

2

这是另一种情况,其中Jakarta Commons IOUtils是比自己写的更好的选择。这是一行代码,它已经过全面测试。在这种情况下,我推荐IOUtils.readFully()

如果它没有读取整个缓冲区,那么你知道你没有发送所有的内容。也许你错过了服务器端的刷新。

+0

+1好建议 – 2013-01-10 14:36:30

0

你是什么意思呢“出错了”?什么是输出?在读取完整的64 KB之前,它不能退出循环,那么究竟发生了什么?

此外,在假定I/O成功之前,最好另行保存I/O调用的返回值并检查它。如果这是DataInputStream.read(),则它在错误时返回-1。

1

InputStream.read()返回读取的字节数,如果已到达流的末尾,则返回-1。您需要检查错误情况。另外,我怀疑你的while(..)循环是问题。你为什么把它称为pos?你可能会过早地终止。此外,请确保您的C代码(无论它在做什么)正确发送。您可以使用类似Wireshark的工具来检查网络流量。

0

您的代码不正确,因为它不检查-1。

这是使用DataInputStream.readFully()的情况,而不是自己编写代码并弄错。