我试过这个,但是在某个地方我无法读取服务器的响应。 (响应采用 XML 格式)。
我已经读过由于字符串断裂,通过套接字写入需要缓冲。不知何故,当我使用 jaxb 解组器并报告 SAX EOF 异常时,我发现这是真的,这意味着读取的 xml 不完整。
请问如何正确缓冲写入和缓冲读取?
StringBuilder sb = new StringBuilder();
sb.append("<estel>");
sb.append("<header><requesttype>").append(hd.getRequestType()).append("</requesttype></header>");
sb.append("<request>");
sb.append("<agentcode>").append(rq.getAgentCode()).append("</agentcode>");
sb.append("<pin>").append(rq.getPin()).append("</pin>");
sb.append("<destination>").append(rq.getDestination()).append("</destination>");
sb.append("<agenttransid>").append(rq.getAgentTransId()).append("</agenttransid>");
sb.append("<vendorcode>").append(rq.getVendorCode()).append("</vendorcode>");
sb.append("<amount>").append(rq.getAmount()).append("</amount>");
sb.append("<productcode>").append(rq.getProductCode()).append("</productcode>");
sb.append("<comments>").append(rq.getComments()).append("</comments>");
sb.append("<clienttype>").append(rq.getClientType()).append("</clienttype>");
sb.append("</request></estel>");
Socket socket = new Socket("41.206.23.21",7101);
OutputStream os = socket.getOutputStream();
InputStream in = socket.getInputStream();
OutputStream buf = new BufferedOutputStream(os);
out = new OutputStreamWriter(buf);
System.out.printf("nxml is %s",sb.toString());
System.out.print("n--------writing--to--socket-----");
out.write(sb.toString());
out.flush();
//read response
InputStream bui = new BufferedInputStream(in);
rd = new InputStreamReader(bui);
System.out.print("nxml response"+rd.toString());
in.close();
out.close();
socket.close();
您通过套接字发送 XML,但服务器端没有应答。要 100% 确定会发生什么,我们需要服务器代码和服务器错误消息。到目前为止,我看到两件事,你可以做:
写入和刷新XML时,可以调用
socket.shutdownOutput()
。这会向服务器发送一个 EOF,表明没有更多内容可读。最新的服务器应该知道,它必须处理 XML 并产生结果。您通过
char
的流发送byte
的字符串。希望服务器以与客户端发送它相同的方式理解这一点。由于希望对编程没有真正的帮助,您应该像这样包装输出流:Writer writer = new OutputStreamWriter(socket.shutdownOutput(), "UTF-8");
并与编写器一起进行写入和刷新。请注意,您需要在服务器端对输入流执行相同的操作(用“UTF-8”包装为 Reader)