Java丢失输入流缓冲区的一部分

Java丢失输入流缓冲区的一部分,java,xml,linux,inputstream,Java,Xml,Linux,Inputstream,我目前正在做一个项目,从XML输入流解析天气数据。但是,我遇到了一个与Linux相关的奇怪错误 当在Windows上运行接收输入流的服务器软件时,一切都像一个魔咒。但是,在Linux上运行服务器时,会出现以下错误。在正确接收到两条消息后,第三条左右的消息将被破坏,因为一半的输入缓冲区将“丢失” 此问题仅在以下情况下发生: [平台][XML流的来源][发生错误] Windows本地主机号 Windows远程编号 Linux本地主机号 Linux远程是 我使用以下代码来接收XML流 private

我目前正在做一个项目,从XML输入流解析天气数据。但是,我遇到了一个与Linux相关的奇怪错误

当在Windows上运行接收输入流的服务器软件时,一切都像一个魔咒。但是,在Linux上运行服务器时,会出现以下错误。在正确接收到两条消息后,第三条左右的消息将被破坏,因为一半的输入缓冲区将“丢失”

此问题仅在以下情况下发生:

[平台][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流的技术信息。