Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过java套接字发送xml字符串的最佳方式是什么?_Java_Xml_Sockets_Jaxb_Bufferedreader - Fatal编程技术网

通过java套接字发送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>")

我试过了,但在这条线路的某个地方,我无法读取服务器的响应。(响应是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();
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%确定发生了什么,我们需要服务器代码和服务器错误消息。到目前为止,我看到两件事,你可以做:

  • 写入和刷新XML时,可以调用
    socket.shutdownOutput()
    。这会向服务器发送一个EOF,表示没有更多的内容可读取。服务器应该知道的最新情况是,它必须处理XML并生成结果

  • 通过
    字节流
    发送字符串
    char
    。希望服务器能像客户端发送一样理解这一点。由于hope在编程中并没有真正的帮助,您应该这样包装输出流:
    Writer Writer=newoutputstreamwriter(socket.shutdownputput(),“UTF-8”)
    并与编写器进行写入和刷新。注意,您需要在服务器端对输入流执行相同的操作(使用“UTF-8”包装为读取器)


  • 请将问题简化为显示错误的运行代码段。发布一些甚至没有编译的代码,并不能真正帮助您理解问题所在。即使在将此代码装配到方法中并导入java.io内容之后,仍有4个(!)未声明的变量:
    hd、rq、out和rd

    要帮助解决您的问题并回答您的问题:

  • 您不需要使用缓冲写入程序,只需确保写入所有您想写入的内容(然后刷新或关闭流)。当然,客户机(接收方)在试图解释数据之前,必须从该流中读取字节数

  • 如果你想实现一个不同的协议,你当然必须读/写,直到某个标记或任何东西表明你的传输完成。但是对于这个问题,我假设您只想传输一组XML数据

  • 对于编写,您可以使用简单的
    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?