java socket读xml需解决tcp粘包拆包问题:服务端应加长度头或分隔符,客户端循环读取至完整;解析时须显式指定utf-8编码,避免乱码;dom需等数据收全,sax可边收边解析但characters()可能多次触发。

Java Socket读取XML流时,为什么收不到完整数据
Socket本身不关心内容格式,它只负责收发字节流。XML是结构化文本,必须等完整报文到达才能解析,而TCP可能把一个XML拆成多次送达,或把多个XML粘在一起。常见现象是DocumentBuilder.parse()抛SAXParseException,提示“Premature end of file”或“Content is not allowed in prolog”。
- 别用
BufferedReader.readLine()——XML里可能有换行,且没有行尾标记 - 服务端必须明确约定结束方式:比如固定长度头(4字节表示后续XML字节数),或用特殊分隔符(如
"