2

当使用此代码发送我的肥皂 xml 时,我想通过 TCP 传输向代理服务发送请求

Socket clientSocket = new Socket("host", port);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

outToServer.writeBytes("soap xml instance");

clientSocket.close();

它工作正常,我的生意还在继续。

但是当我发送两个 xml 而不像这样关闭套接字时:

Socket clientSocket = new Socket("host", port);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

outToServer.writeBytes("soap xml instance");

outToServer.writeBytes("another soap instance");

clientSocket.close();

它总是抛出这个异常:

TID:[0] [ESB] [2013-06-28 13:36:10,838] 错误 {org.apache.axis2.transport.tcp.TCPWorker} - 通过 Axis2 引擎 {org.apache.axis2 处理 TCP 请求时出错.transport.tcp.TCPWorker} org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxParsingException: 非法处理指令目标(“xml”);xml(不区分大小写)由规范保留。在 [row,col {unknown-source}]: [2,5] 在 org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296) 在 org.apache.axiom.om.impl .llom.OMDocumentImpl.buildNext(OMDocumentImpl.java:135) 在 org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122) 在 org.apache.axiom.om.impl.llom.OMElementImpl .getNextOMSibling(OMElementImpl.java:343) 在 org.apache.axiom.om.impl.traverse。ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 原因:com .ctc.wstx.exc.WstxParsingException:非法处理指令目标(“xml”);xml(不区分大小写)由规范保留。在 [row,col {unknown-source}]: [2,5] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606) at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner .java:479) 在 com.ctc.wstx.sr.BasicStreamReader.readPIPrimary(BasicStreamReader.java:3903) 在 com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2037) 在 com.ctc.wstx。 sr.BasicStreamReader.closeContentTree(BasicStreamReader.java:

我使用附加 '\n', "\r\n" 到我的消息,但他们都没有做到这一点。

我也尝试使用此链接中说明的方法。如何使用 TCP 传输发送 SOAP 消息,它运行良好。

但是我不能在我的项目中使用那种 api。我怎样才能摆脱这个问题。

4

1 回答 1

1

我能够使用示例客户端向 ESB 发送 TCP 消息,但您必须确保发送 XML 元素。

首先确保您在axis2.xml (repository/conf/axis2/axis2.xml) 中为tcp 启用了传输接收器

<transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportListener" >

========================我的代理服务接收TCP消息===========

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TCPProxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full"/>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
   </target>
   <parameter name="transport.tcp.port">6789</parameter>
   <parameter name="transport.tcp.contentType">application/xml</parameter>
   <description/>
</proxy>

==向 TCP 服务器发送消息的客户端 ====

import java.io.*;
import java.net.*;

class TCPClient {
    String host = "localhost";
    int port = 6789;
    Socket socket = null;
    public static void main(String args[]) throws Exception{
        String name ="Amani";
        TCPClient client = new TCPClient();
        String message = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +  
        "<soapenv:Header/>\n" +
        "<soapenv:Body>\n" +
        "  <p:greet xmlns:p=\"http://greet.service.amani.org\">\n" + 
        "     <in>" + name + "</in>\n" +
        "  </p:greet>\n" +
        "</soapenv:Body>\n" +
        "</soapenv:Envelope>";
        client.SendToServer("<test></test>");
        client.close();
    }

    TCPClient(String _host, int _port) throws Exception{
        host = _host;
        port = _port;
        socket = new Socket(host, port);
    }
    TCPClient() throws Exception{
        socket = new Socket(host, port);
    }
    void SendToServer(String msg) throws Exception{
        //create output stream attached to socket
        PrintWriter outToServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
        //send msg to server
        outToServer.print(msg + '\n');
        outToServer.flush();
    }
    String RecieveFromServer() throws Exception{
        //create input stream attached to socket
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader (socket.getInputStream()));
        //read line from server
        String res = inFromServer.readLine(); // if connection closes on server end, this throws java.net.SocketException 
        return res;
    }
    void close() throws IOException{
        socket.close();
    }
}
于 2013-09-24T05:36:19.070 回答