我正在用Java开发一个套接字应用程序,它以ASCII格式从服务器接收一些HTML数据,然后相应地解析该数据。
byte[] receivedContent = new byte[12500];
receivedSize = inputStream.read(receivedContent);
receivedContent = Arrays.copyOf(receivedContent, receivedSize+1);
if (receivedSize == -1) {
System.out.println("ERROR! NO DATA RECEIVED");
System.exit(-1);
}
lastReceived = new String(receivedContent, StandardCharsets.US_ASCII);
这确实应该很简单,但事实并非如此。我打印了一些调试消息,发现尽管接收到一些字节的数据,(例如,示例接收到的大小告诉我接收到784个字节),但是从这些字节得到的字符串只有几个字符长,如下所示:
Ard</a></li><li><a
我期待一个完整的HTML文档,因此这显然是错误的。关于何时发生这种情况也没有明显的模式。看来完全是随机的。由于我正在为缓冲区分配新的内存,因此实际上不应有任何旧数据与套接字中的新数据混淆。有人可以阐明这种奇怪的行为吗?同样,在运行OracleJDK的Windows计算机上而不是在运行OpenJDK的远程Ubunut计算机上,这种情况发生的频率降低了,这可能是原因,我该如何解决?
更新: 最后,我根据ASCII表手动检查了字节数组的ASCII编码,发现服务器有意发送乱码数据。谜团解决了。
答案 0 :(得分:2)
代替使用:
inputStream.read(receivedContent);
您需要从流中读取所有数据。使用类似的东西(来自Apache Commons io):
IOUtils.readFully(inputStream, receivedContent)