利用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 解决系统转接问题,这一整套也可以用于当双方所支持的报文格式不一样时,利用此系统稍做修改就可以了!这里只是一个解决方案,具体代码可以根据项目要求实现!