1、原demo
服务端:
public static void main(String[] args) throws Exception{
// 监听指定的端口
int port = 55533;
ServerSocket server = new ServerSocket(port);
// server将一直等待连接的到来
System.out.println("server将一直等待连接的到来");
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
//1.创建Reader对象
SAXReader reader = new SAXReader();
//2.加载xml
Document document = reader.read(inputStream);
//3.获取根节点
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
StringBuffer sb = new StringBuffer();
while (iterator.hasNext()) {
Element stu = (Element) iterator.next();
sb.append("节点名:" + stu.getName() + "---节点值:" + stu.getStringValue() );
}
System.out.println("get message from client: " + sb);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("客户端,我收到信息了".getBytes("UTF-8"));
inputStream.close();
outputStream.close();
socket.close();
server.close();
}
客户端:
public static void main(String[] args) throws Exception {
String data = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
"<SERVICE>\n" +
" <prcscd>mbr128</prcscd>\n" +
" <servtp>MBL</servtp>\n" +
" <acctno>100633778400041</acctno>\n" +
"</SERVICE>";
// 与服务端建立连接
Socket socket = new Socket("127.0.0.1", 55533);
//设置超时时间
socket.setSoTimeout(10*1000);
// 建立连接后获得输出流
OutputStream outputStream = socket.getOutputStream();
socket.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8));
//通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len, StandardCharsets.UTF_8));
}
System.out.println("收到响应报文: " + sb);
inputStream.close();
outputStream.close();
socket.close();
}
运行后出现异常:
经过多次尝试发现是 服务端中的 SAXReader reader = new SAXReader(); 在读取输入流解析为xml的Document时导致的,这个输入流时Socket连接的输入流,猜测在执行解析xml的过程中可能会将流关闭导致的。
解决方案:
如上图将原来Socket的输入读取为字符串,然后再生成一个新的输入流传入SAXReader解析为xml的Document对象。