将XML转换为通过TCP转换为字节数组的最佳方法是什么,然后将响应转换回可读的XML?

时间:2015-06-09 17:33:10

标签: java arrays xml sockets byte

我被要求编写一个解决方案,将XML转换为字节数组,作为请求通过直接TCP与.Net服务一起发送,以及服务所需的其他参数。该服务以字节数组格式返回XML。在以下解决方案中,我尝试实施这些原则:

  1. 打开一个插座。
  2. 打开输入流并输出流到套接字。
  3. 根据服务器协议读取和写入流。
  4. 关闭溪流。
  5. 关闭套接字。
  6. 请注意,我从主程序调用下面的代码,该程序将XML文件转换为requestData参数的字节数组,并通过创建类的实例来关闭打开的套接字。在输出中,我获得了一个看起来像[B@60076007的值列表。

    我的问题是:上面的输出示例是否需要转换回XML的字节数组格式?如果是,是否有关于如何执行此操作的建议?有没有更好的方法来组织这段代码?就像发送和接收应该在单独的功能中一样?感谢任何愿意回复的人。

    public class  TCPTest implements Closeable {
    
    
    private static final Logger logger = Logger.getLogger( TCPTest.class);
    
    private Socket socket;
    
    public  TCPTest(String host, int port) throws IOException {
        this(new Socket(host, port));
    }
    
    public  TCPTest(Socket s) {
        this.socket = s;
    }
    
    public void send TCPRequest(int testId, String method, byte[] requestData, boolean sendLength) throws IOException {
    
        socket.setSoTimeout(40000);
    
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());
    
        try 
        {
            dos.write(testId);
            dos.writeBytes(method);
    
            dos.write(requestData); // write the message
            System.out.println("length of request: " + requestData.length);
    
            if (sendLength) {
                String lengthDesc = "LEN*";
                byte[] lengthDescBytes = lengthDesc.getBytes("US-ASCII");
    
                dos.write(lengthDescBytes);
    
                dos.write(requestData.length);
            }
    
        } catch (UnknownHostException e) {
            System.err.println("Unable to find host: 3125");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: 3125");
        }
    
        try 
        {
            int lengthResponse = dis.read(); // get length of incoming message
            System.out.println("length of response: " + lengthResponse);
    
            while (lengthResponse > 0) {
                byte[] message = new byte[lengthResponse];
                System.out.println(message);
    
                dos.write(message, 0, lengthResponse);
    
            }
    
        } catch (EOFException e) {
            System.err.println("Input stream ended before all bytes read");
        } catch (IOException e) {
            System.err.println("I/O failed on the connection to: 3125");
        }
    
        dos.flush();
        dos.close();
    }
    
    @Override
    public void close() throws IOException {
        this.socket.close();
    }
    

    }

1 个答案:

答案 0 :(得分:0)

基本上,传入的数据是byte[],因为这是关于该对象[B@60076007的字符串形式,至少是[B部分。

现在,由于XML只是简单的String,您可以使用String(byte[] bytes, Charset charset)将字节数组转换为String,您必须提供将用于转换的编码。

如果这还不够,您可以从字符串表单创建您需要的任何其他XML表示(w3c,dom4j等)。

除了查看你的代码之外,我还可以看到你根本没有读取服务器输出。

int lengthResponse = dis.read(); // get length of incoming message

不,此行从流中读取第一个字节(不是整数)。整数长度为4个字节。

 byte[] message = new byte[lengthResponse];
    System.out.println(message);

你正在创建新的字节数组(缓冲区),但是你永远不会写入它(通过从输入流中读取)。之后,您将打印message.toString()方法的结果。

您需要先阅读整个邮件,然后再转换并存储。

伪代码:

    InputStream in;
    byte[] buff=new byte[your_length]

    in.read(buff) //this line will read your_length bytes from the input stream
    String message=new String(buff,ProperCharset); //convert to string
    sysout(message); // print it
    //do whatewer you like eg, store to your DataOutputStream with 
    // out.write(message.getBytes(ProperCharset));
    // or directly out.write(buff);