利用java socket 解決系統轉接問題

利用java socket 解決系統轉接問題

在日常的開發項目中,有時候會遇到這種情況:自己公司開發的系統要接入第三方系統時,有時候會因爲每個公司的底層的jdk版本不一樣,而導致發送過去的報文,到第三方時無法解析。

項目實例:

        在做金融系統軟件時,我們常會遇到,加密解密,而加密解密這一整套機制往往是而第三方公司提供的,在我所做的項目中:因爲第三方公司的加密解密程序是基於sun jdk版本,而公司自己的框架是基於IBM jkd版本的,所以導致加密出來的報文發送到第三方公司解密不了,爲此,單獨寫一個以sun jdk版本的系統進行一個轉接,將公司前臺頁面加密後的報文通過scocke發送到這個系統,然後由此係統進行java 加密算法加密,將加密報文發送給第三方公司,第三方公司接受報文進行解密,發送加密報文到這系統,這系統將報文解密成功後,將返回結果直接發送到公司自己的框架系統,終於實現一整套完整的加密解密驗證。

       相關代碼如下:

       寫一個servlet程序,當項目啓動時,直接調用這servlet

public void doPost(HttpServletRequest request,HttpServletResponse  response) throws IOException, ServletException{
System.out.println("------");
}
public void doGet(HttpServletRequest request,HttpServletResponse  response) throws IOException, ServletException{
doPost(request,response);
}
public void init() throws ServletException {
 Hvericfca hiver = new Hvericfca();
 hiver.run();
}

        寫個多線程

public class Hvericfca extends Thread {
public void run() {
ServerSocket srv = null;
try {
srv = new ServerSocket();
SocketAddress sa = new InetSocketAddress(7777);
srv.bind(sa);
while (true) {
Socket socket = srv.accept();
try {
new ServeOneJabber(socket);
} catch (IOException e) {
socket.close();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
srv.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

class ServeOneJabber extends Thread {
private Socket socket;
private InputStream in;;
private OutputStream out;


public ServeOneJabber(Socket s) throws IOException {
socket = s;
in = socket.getInputStream();
out = socket.getOutputStream();
start();
}

public void run() {
try {
@SuppressWarnings("unused")
int rc = 0, recvlen;
byte[] recvbuf = new byte[65537];
byte[] headbuf = new byte[9];
rc = recv(headbuf, 8);
String slen = new String(headbuf).replaceFirst("^0*", "");
recvlen = Integer.parseInt(slen.trim());
rc = recv(recvbuf, recvlen);
String sendmsg = new String(recvbuf, 0, recvlen);
this.process(sendmsg);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
}
}
}


private synchronized void process(String str) throws IOException {
System.out.println("reply is -- " + str);
KpsVeriy veriy = new KpsVeriy();
String srcdata = this.readStringXml(str, "SRC_DATA");
String signdata = this.readStringXml(str, "SIGN_DATA");
String result = veriy.Veriy(srcdata, signdata);
StringBuffer sbf = new StringBuffer();
StringBuffer sbfxml = new StringBuffer();
sbf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sbf.append("<ROOT>");
sbf.append("<TRSP_CD>");
sbf.append("000000");
sbf.append("</TRSP_CD>");
sbf.append("<RSP_CD>");
sbf.append("KPS00000");
sbf.append("</RSP_CD>");
sbf.append("<RESULT>");
sbf.append(result);
sbf.append("</RESULT>");
sbf.append("</ROOT>");
int xmllen = sbf.toString().length();
int len = String.valueOf(xmllen).length();
int i = 8 - len;
String headxml = "";
for (int a = 0; a < i; a++) {
headxml = headxml + "0";
}
headxml = headxml + xmllen;
sbfxml.append(headxml);
sbfxml.append(sbf);
byte[] sendbuf = sbfxml.toString().getBytes();
out.write(sendbuf);
}


// 解析xml報文
private String readStringXml(String xml, String domname) {
StringReader read = new StringReader(xml);
InputSource source = new InputSource(read);
SAXBuilder sb = new SAXBuilder();
try {
Document doc = sb.build(source);
Element root = doc.getRootElement();
Element dom = root.getChild(domname);
return dom.getValue();
} catch (JDOMException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

      //定長的報文解析
int recv(byte[] recvbuffer, int len) {
int LeftByte;
try {
LeftByte = len;
while (LeftByte > 0) {
int rc = in.read(recvbuffer, len - LeftByte, LeftByte);
LeftByte -= rc;
}
} catch (IOException e) {
return -1;
}
return len;
}

       調用第三方公司的加密解密API中的方法

public String Veriy(String srcdata,String signdata){
  int rc = 0;
System.out.println("環境初始化");

       /*加密解密的API方法這裏就不提供了*/
if (rc != 0) {
log.info("企業簽名驗證測試失敗:" + kpsSign.getErrDesc());
System.out.println("企業簽名驗證測試失敗:" + kpsSign.getErrDesc());
return "NO";
} else {
log.info("企業簽名驗證測試成功");
System.out.println("企業簽名驗證測試成功");
return "OK";
}
}

        以上一整套就是利用java socket 解決系統轉接問題,這一整套也可以用於當雙方所支持的報文格式不一樣時,利用此係統稍做修改就可以了!這裏只是一個解決方案,具體代碼可以根據項目要求實現!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章