银行接口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