银行接口Socket传输XML实列

银行接口Socket传输XML

因为项目需要,行方不提供http接口,只提供socket接口,并且用XML格式传输(并且没有联调,所以本地创建server端和client端进行本地调试)。

请求报文:

    <?xml version="1.0" encoding="UTF-8"?>
    <packet>
        <SYS_ID>ZFB2C</SYS_ID>
        <TRANS_CODE>TOKEN</ TRANS_CODE>
    </packet>

响应报文:

    <?xml version="1.0" encoding="UTF-8"?>
    <packet>
        <SYS_ID>ZFB2C</SYS_ID>
        <TRANS_CODE>TOKEN</ TRANS_CODE>
        < ACCESS_TOKEN >skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf</ ACCESS_TOKEN >
        <RET_CODE>0000</ RET_CODE>
        <RET_RMK>token值</RET_RMK>
    </packet>

server端:

package com.demo.socket7;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
* Socket通信XML
* @author earthxuan
*
*/
public class SocketServerTest {
    public static void main(String[] args) throws IOException, ParserConfigurationException, TransformerException {
    System.out.println("server.......");
    ServerSocket serverSocket=null;
    Socket sk=null;
 serverSocket=new ServerSocket(9999);
    while (true){
	    //阻塞获取请求
        sk=serverSocket.accept();
        InputStream inputStream=sk.getInputStream();
        //读客户端传来的数据
        DataInputStream in = new DataInputStream(inputStream);
        String data = in.readUTF();
//		System.out.println("接收到的数据:" + data);
        //对客户端信息的校验,或者做其他的过滤
        if(data.length()<5){
    	//数据长度小于5,则不需要解析客户端的数据,直接回传报文,RET_CODE为1111
        OutputStream outputStream=sk.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);

        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder=factory.newDocumentBuilder();
        Document document=documentBuilder.newDocument();
        Element parent=document.createElement("packet");
        document.appendChild(parent);

        Element SYS_ID=document.createElement("SYS_ID");
        SYS_ID.setTextContent("ZFB2C");
//      SYS_ID.appendChild(document.createTextNode("ZFB2C"));
        Element TRANS_CODE=document.createElement("TRANS_CODE");
        TRANS_CODE.setTextContent("TOKEN");
//      TRANS_CODE.appendChild(document.createTextNode("TOKEN"));
        Element ACCESS_TOKEN=document.createElement("ACCESS_TOKEN");
//      ACCESS_TOKEN.appendChild(document.createTextNode("skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf"));
        ACCESS_TOKEN.setTextContent("skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf");
        Element RET_CODE=document.createElement("RET_CODE");
//      RET_CODE.appendChild(document.createTextNode("1111"));
        RET_CODE.setTextContent("1111");
        Element RET_RMK=document.createElement("RET_RMK");
//      RET_RMK.appendChild(document.createTextNode("交易成功"));
        RET_RMK.setTextContent("交易成功");
        parent.appendChild(SYS_ID);
        parent.appendChild(TRANS_CODE);
        parent.appendChild(ACCESS_TOKEN);
        parent.appendChild(RET_CODE);
        parent.appendChild(RET_RMK);
        
        //xml转换,转为字符串
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        Transformer transformer=transformerFactory.newTransformer();

        DOMSource source=new DOMSource(document);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        transformer.transform(source, new StreamResult(bos));
        String result=bos.toString();

        //写到客户端
        dataOutputStream.writeUTF(result);
        //把dataOutputStream数据flush掉,全部传到客户端
        dataOutputStream.flush();
        //关闭流
        dataOutputStream.close();
        outputStream.close();
    }else{
    	//解析客户端的数据,回传报文,RET_CODE为0000
    	DOM(data);
        OutputStream outputStream=sk.getOutputStream();
        DataOutputStream dataOutputStream=new DataOutputStream(outputStream);

        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder=factory.newDocumentBuilder();
        Document document=documentBuilder.newDocument();
        document.setXmlStandalone(true);
        Element parent=document.createElement("packet");
        document.appendChild(parent);

        Element SYS_ID=document.createElement("SYS_ID");
        SYS_ID.setTextContent("ZFB2C");
//      SYS_ID.appendChild(document.createTextNode("ZFB2C"));
        Element TRANS_CODE=document.createElement("TRANS_CODE");
        TRANS_CODE.setTextContent("TOKEN");
//      TRANS_CODE.appendChild(document.createTextNode("TOKEN"));
        Element ACCESS_TOKEN=document.createElement("ACCESS_TOKEN");
//      ACCESS_TOKEN.appendChild(document.createTextNode("skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf"));
        ACCESS_TOKEN.setTextContent("skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf");
        Element RET_CODE=document.createElement("RET_CODE");
//      RET_CODE.appendChild(document.createTextNode("0000"));
        RET_CODE.setTextContent("0000");
        Element RET_RMK=document.createElement("RET_RMK");
//      RET_RMK.appendChild(document.createTextNode("交易成功"));
        RET_RMK.setTextContent("交易成功");
        parent.appendChild(SYS_ID);
        parent.appendChild(TRANS_CODE);
        parent.appendChild(ACCESS_TOKEN);
        parent.appendChild(RET_CODE);
        parent.appendChild(RET_RMK);

        //xml转换,转为字符串
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        Transformer transformer=transformerFactory.newTransformer();

        DOMSource source=new DOMSource(document);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        transformer.transform(source, new StreamResult(bos));
        String result=bos.toString();

        //写到客户端
        dataOutputStream.writeUTF(result);
      //把dataOutputStream数据flush掉,全部传到客户端
        dataOutputStream.flush();
      //关闭流
        dataOutputStream.close();
        outputStream.close();
    }
    in.close();
    inputStream.close();
    sk.close();
}
}

//DOM解析
public static void DOM(String data) {
try {
    //遍历xml获取内容
    byte[] b = data.getBytes();
    InputStream inp = new ByteArrayInputStream(b);
    DocumentBuilderFactory factory = DocumentBuilderFactory
            .newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(inp);
    NodeList nl = doc.getElementsByTagName("persons");
    //用最外层节点数来遍历
    for (int i = 0; i < nl.getLength(); i++) {
        System.out.println("person:  "
                + doc.getElementsByTagName("person").item(i)
                .getFirstChild().getNodeValue());
        System.out.println("name:  "
                + doc.getElementsByTagName("name").item(i)
                .getFirstChild().getNodeValue());
        System.out.println("sex:  "
                + doc.getElementsByTagName("sex").item(i)
                .getFirstChild().getNodeValue());
        System.out.println("age:  "
                + doc.getElementsByTagName("age").item(i)
                .getFirstChild().getNodeValue());
    }
} catch (Exception e) {
    e.printStackTrace();
}
}
}

client端:

package com.demo.socket7;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
* Socket通信XML
* @author earthxuan
*
*/
public class SocketClientTest {
public static void main(String[] args) throws IOException, TransformerException, ParserConfigurationException {
System.out.println("client.........");
Socket socket=null;
//InetAddress inetAddress=InetAddress.getByName("10.2.152.241");
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
int serverPort=9999;
//测试主机是否在线(Windows XP不适用)
if(inetAddress.isReachable(5000)){
    socket=new Socket(inetAddress,serverPort);
    
    //封装数据写给服务器端
    OutputStream outputStream=socket.getOutputStream();
    DataOutputStream dataOutputStream=new DataOutputStream(outputStream);

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder=factory.newDocumentBuilder();
    Document document=documentBuilder.newDocument();
    document.setXmlStandalone(true);
    Element parent=document.createElement("packet");
    document.appendChild(parent);

    Element SYS_ID=document.createElement("SYS_ID");
    SYS_ID.appendChild(document.createTextNode("ZFB2C"));
    Element TRANS_CODE=document.createElement("TRANS_CODE");
    TRANS_CODE.appendChild(document.createTextNode("TOKEN"));
    Element ACCESS_TOKEN=document.createElement("ACCESS_TOKEN");
    ACCESS_TOKEN.appendChild(document.createTextNode("skdlajtfoiewjflkdsajflkdsajlkfdsajfljdsalkf"));
    Element RET_CODE=document.createElement("RET_CODE");
    RET_CODE.appendChild(document.createTextNode("0000"));
    Element RET_RMK=document.createElement("RET_RMK");
    RET_RMK.appendChild(document.createTextNode("交易成功"));
    parent.appendChild(SYS_ID);
    parent.appendChild(TRANS_CODE);
    parent.appendChild(ACCESS_TOKEN);
    parent.appendChild(RET_CODE);
    parent.appendChild(RET_RMK);
    
    System.out.println(document.toString());
    //转换xml
    TransformerFactory transformerFactory=TransformerFactory.newInstance();
    Transformer transformer=transformerFactory.newTransformer();

    DOMSource source=new DOMSource(document);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    transformer.transform(source, new StreamResult(bos));
    String result=bos.toString();

    //写数据
    dataOutputStream.writeUTF(result);
//  socket.shutdownOutput();
    // 4.获取输入流,并读取服务器端的响应信息
    // 4.关闭资源
    //读
    InputStream is = socket.getInputStream();
    DataInputStream in = new DataInputStream(is);
    String data = in.readUTF();
    DOM(data);
    in.close();
    is.close();
    bos.close();
    dataOutputStream.flush();
    dataOutputStream.close();
    socket.close();
}
}
//dom解析
public static void DOM(String data) {
try {
    //遍历xml获取内容
    byte[] b = data.getBytes();
    InputStream inp = new ByteArrayInputStream(b);
    DocumentBuilderFactory factory = DocumentBuilderFactory
            .newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(inp);
//        NodeList nl = doc.getElementsByTagName("packet");
//		System.out.println(nl.getLength());
//        for (int i = 0; i < nl.getLength(); i++) {
        System.out.println("RET_CODE:  "
                + doc.getElementsByTagName("RET_CODE").item(0)
                .getFirstChild().getNodeValue());
        System.out.println("RET_RMK:  "
                + doc.getElementsByTagName("RET_RMK").item(0)
                .getFirstChild().getNodeValue());
//        }
} catch (Exception e) {
    e.printStackTrace();
}
}

}

需要的jar包如下:

先启动服务端,然后再启动客户端:

输出结果如下:

参考链接:https://blog.csdn.net/qq_27185561/article/details/83341021

猜你喜欢

转载自blog.csdn.net/qq_30764991/article/details/97989446