通过java套接字发送xml字符串的最佳方式是什么?
我试过了,但在这条线路的某个地方,我无法读取服务器的响应。(响应是XML格式的) 我已经读到,由于字符串中断,在套接字上写需要缓冲。不知怎的,当我使用jaxb解组器时发现这是真的,它报告了SAX EOF异常,这意味着读取的xml不完整 请问如何正确地进行缓冲区写入和读取通过java套接字发送xml字符串的最佳方式是什么?,java,xml,sockets,jaxb,bufferedreader,Java,Xml,Sockets,Jaxb,Bufferedreader,我试过了,但在这条线路的某个地方,我无法读取服务器的响应。(响应是XML格式的) 我已经读到,由于字符串中断,在套接字上写需要缓冲。不知怎的,当我使用jaxb解组器时发现这是真的,它报告了SAX EOF异常,这意味着读取的xml不完整 请问如何正确地进行缓冲区写入和读取 StringBuilder sb = new StringBuilder(); sb.append("<estel>"); sb.append("<header><requesttype>")
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();
StringBuilder sb=新建StringBuilder();
某人加上(“”);
sb.append(“”).append(hd.getRequestType()).append(“”);
某人加上(“”);
sb.append(“”).append(rq.getAgentCode()).append(“”);
sb.append(“”).append(rq.getPin()).append(“”);
sb.append(“”).append(rq.getDestination()).append(“”);
sb.append(“”).append(rq.getAgentTransId()).append(“”);
sb.append(“”).append(rq.getVendorCode()).append(“”);
sb.append(“”).append(rq.getAmount()).append(“”);
sb.append(“”).append(rq.getProductCode()).append(“”);
sb.append(“”).append(rq.getComments()).append(“”);
sb.append(“”).append(rq.getClientType()).append(“”);
某人加上(“”);
插座=新插座(“41.206.23.21”,7101);
OutputStream os=socket.getOutputStream();
InputStream in=socket.getInputStream();
OutputStream buf=新的BufferedOutputStream(os);
out=新的OutputStreamWriter(buf);
System.out.printf(“\nxml是%s”,sb.toString());
System.out.print(“\n-------写入--到--套接字------”);
写出(某人写的东西);
out.flush();
//读取响应
InputStream bui=新的BufferedInputStream(in);
rd=新的InputStreamReader(bui);
System.out.print(“\nxml响应”+rd.toString());
in.close();
out.close();
socket.close();
您通过套接字发送XML,但服务器端没有应答。为了100%确定发生了什么,我们需要服务器代码和服务器错误消息。到目前为止,我看到两件事,你可以做:
socket.shutdownOutput()
。这会向服务器发送一个EOF,表示没有更多的内容可读取。服务器应该知道的最新情况是,它必须处理XML并生成结果字节流
发送字符串char
。希望服务器能像客户端发送一样理解这一点。由于hope在编程中并没有真正的帮助,您应该这样包装输出流:Writer Writer=newoutputstreamwriter(socket.shutdownputput(),“UTF-8”)
并与编写器进行写入和刷新。注意,您需要在服务器端对输入流执行相同的操作(使用“UTF-8”包装为读取器)请将问题简化为显示错误的运行代码段。发布一些甚至没有编译的代码,并不能真正帮助您理解问题所在。即使在将此代码装配到方法中并导入java.io内容之后,仍有4个(!)未声明的变量:
hd、rq、out和rd
要帮助解决您的问题并回答您的问题:
OutputStream
一次性编写字符串。
这样的代码可以完成这项工作:
StringBuilder sb = new StringBuilder();
//...
Socket socket = new Socket("41.206.23.21", 7101);
OutputStream os = socket.getOutputStream();
os.write(sb.toString().getBytes());
os.flush();
读到这一点,您还可以使用一个简单的InputStream
。为了确保获得所有内容,通常应读取数据并将其全部写入中间字节数组,然后将其转换回字符串。这样做的一般方法如下:
String read(InputStream in) throws IOException {
byte[] buffer = new byte[8192];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int got;
while ((got = in.read(buffer)) > -1) {
out.write(buffer, 0, got);
}
byte[] data = out.toByteArray();
String result = new String(data);
return result;
}
请记住,此方法既不关闭流,也不处理异常。您所说的仅适用于HTTP POST请求。普通套接字有一种直接的行为。@Matthia因为我实际上尝试了你的版本,但它挂起@在开始向套接字写入时,整个代码都在一个try块中,IOException捕获了它。在哪一点上?您可以在两个程序或至少两个线程中完成,是吗?我只是用一个main方法在一个类中编写代码,一个try块封装读取的outputstream和inputstream,似乎xml字符串u actualli nid要执行socket.shutDownOutput()。要让它停止挂起,服务器似乎需要更多的数据。socket.shutDownOutput()对xml是强制性的吗?>我这么认为是因为这样可以稳定程序,但我似乎无法从响应中读取我写的内容。仍然没有解决您传输文本的方式(这里通过套接字)与您传输的内容(这里是XML文档)无关。正如我所说,当服务器不响应XML时,服务器就会挂起。很可能是因为服务器仍在等待更多输入或未识别,所以XML结束了。这就是我建议通过输出流发送EOF的原因。但是,由于我们没有关于服务器的信息,这可能是任何其他问题。如果您需要更多帮助,您需要提供有关服务器的更多信息。假设在我telnet时响应字符串是无效的请求,然后使用套接字和jaxb解组,我也会得到此响应,只有当您没有发送正确的xml格式时,才会得到此响应。您得到此响应的原因很简单,因为xml解析器在服务器上抛出异常。在您的例子中,相同的解析器尝试进一步读取,因为它没有收到EOF。您是否尝试过使用socket.shutdownOutput()发送EOF?