Java丢失输入流缓冲区的一部分
我目前正在做一个项目,从XML输入流解析天气数据。但是,我遇到了一个与Linux相关的奇怪错误 当在Windows上运行接收输入流的服务器软件时,一切都像一个魔咒。但是,在Linux上运行服务器时,会出现以下错误。在正确接收到两条消息后,第三条左右的消息将被破坏,因为一半的输入缓冲区将“丢失” 此问题仅在以下情况下发生:Java丢失输入流缓冲区的一部分,java,xml,linux,inputstream,Java,Xml,Linux,Inputstream,我目前正在做一个项目,从XML输入流解析天气数据。但是,我遇到了一个与Linux相关的奇怪错误 当在Windows上运行接收输入流的服务器软件时,一切都像一个魔咒。但是,在Linux上运行服务器时,会出现以下错误。在正确接收到两条消息后,第三条左右的消息将被破坏,因为一半的输入缓冲区将“丢失” 此问题仅在以下情况下发生: [平台][XML流的来源][发生错误] Windows本地主机号 Windows远程编号 Linux本地主机号 Linux远程是 我使用以下代码来接收XML流 private
[平台][XML流的来源][发生错误]
Windows本地主机号
Windows远程编号
Linux本地主机号
Linux远程是
我使用以下代码来接收XML流
private Document getXML() throws JDOMException
{
SAXBuilder builder = new SAXBuilder();
try {
// Get the input stream.
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String xmlstream = "";
String line;
while (!(line = in.readLine()).contains("</MEASUREMENT>")){
xmlstream += line;
}
xmlstream += "</MEASUREMENT></WEATHERDATA>";
System.out.println("XML DATA:" + xmlstream);
Document xmlDocument = builder.build(new StringReader(xmlstream));
return xmlDocument;
} catch (IOException | NullPointerException e) {
// Socket closes.
System.out.println("Client disconnected!");
return null;
}
}
private Document getXML()抛出JDOMException
{
SAXBuilder=新SAXBuilder();
试一试{
//获取输入流。
BufferedReader in=新的BufferedReader(新的InputStreamReader(sock.getInputStream());
字符串xmlstream=“”;
弦线;
而(!(line=in.readLine())包含(“”){
xmlstream+=行;
}
xmlstream+=”;
System.out.println(“XML数据:+xmlstream”);
Document xmlDocument=builder.build(新的StringReader(xmlstream));
归还文件;
}捕获(IOException | NullPointerException e){
//插座关闭。
System.out.println(“客户端断开连接!”);
返回null;
}
}
以下是接收到的数据的示例:
XML DATA:<?xml version="1.0"?><WEATHERDATA> <MEASUREMENT> <STN>726030</STN> <DATE>2018-01-27</DATE> <TIME>13:42:01</TIME> <TEMP>-2.8</TEMP> <DEWP>-2.7</DEWP> <STP>1014.1</STP> <SLP>1019.3</SLP> <VISIB>8.2</VISIB> <WDSP>29.0</WDSP> <PRCP>0.02</PRCP> <SNDP>0.0</SNDP><FRSHTT>110000</FRSHTT> <CLDC>77.1</CLDC> <WNDDIR>191</WNDDIR></MEASUREMENT></WEATHERDATA>
XML DATA:<?xml version="1.0"?><WEATHERDATA> <MEASUREMENT> <STN>726030</STN> <DATE>2018-01-27</DATE> <TIME>13:42:02</TIME> <TEMP>-0.7</TEMP> <DEWP>-3.5</DEWP> <STP>1014.2</STP> <SLP>1019.2</SLP> <VISIB>8.3</VISIB> <WDSP>28.9</WDSP> <PRCP>0.02</PRCP> <SNDP>0.0</SNDP><FRSHTT>110000</FRSHTT> <CLDC>77.2</CLDC> <WNDDIR>191</WNDDIR></MEASUREMENT></WEATHERDATA>
XML DATA:/DATE> <TIME>13:42:02</TIME> <TEMP>-9.4</TEMP> <DEWP>-13.5</DEWP> <STP>1005.1</STP> <SLP>1013.2</SLP> <VISIB>22.8</VISIB> <WDSP>12.8</WDSP> <PRCP>0.25</PRCP> <SNDP>8.3</SNDP> <FRSHTT>111000</FRSHTT> <CLDC>50.0</CLDC> <WNDDIR>311</WNDDIR></MEASUREMENT></WEATHERDATA>
XML数据:726030 2018-01-27 13:42:01-2.8-2.7 1014.1 1019.3 8.2 29.0 0.02 0.0110000 77.1 191
XML数据:726030 2018-01-27 13:42:02-0.7-3.5 1014.2 1019.2 8.3 28.9 0.02 0.0110000 77.2 191
XML数据:/DATE>13:42:02-9.4-13.5 1005.1 1013.2 22.8 12.8 0.25 8.3 111000 50.0 311
正如你所看到的,前两个消息在它的完整性中被接收,但是第三个消息在流的中间随机启动。您确定流源和远程linux服务器之间没有连接问题吗?我假设您在所有情况下都使用相同的JRE?网络“丢弃数据包”应该不会有任何问题。TCP层中的CRC检查和序列号应该可以防止这种情况发生。它几乎肯定是服务器端软件(OP)中的一个bug,或者可能是操作系统版本软件或JVM中的某个bug。应该尝试其他Linux设备进行测试。客户端也有可能存在一个bug,该bug仅在连接到Linux系统时才会出现。我尝试了更多的方法,似乎“切断”蒸汽的算法在某些系统上无法正常工作。您认为在适当的时候分割XML流的最佳方法是什么?如果需要,我可以提供更多关于XML流的技术信息。