Server这边实现的功能有:
1、监听端口,接受Client的报文数据。
2、根据bitmap.ini解析对应格式的报文数据
3、存储解析成功的报文
public class DealClientReq implements Runnable{ Socket socket = null; //保存客户端Socket对象 public DealClientReq(Socket s){ this.socket = s; } public String getDataFromClient(Socket s){ String msg = new String(); DataInputStream dis = null; try{ dis = new DataInputStream(s.getInputStream()); msg = dis.readUTF(); dis.close(); }catch (Exception e){ e.printStackTrace(); }finally { } return msg; } public void run() { try{ String clientMsg = getDataFromClient(socket); DataSaveUtil.SaveOriginalMsg(clientMsg,"parseMsgOutput.txt",DataSaveUtil.FILE); Msg8583Util input8583bag = Msg8583Util.Unpackbag( ToolUtil.sdkAscToBcd(clientMsg.getBytes()), "bitmap.ini"); DataSaveUtil.SaveParseMsg(input8583bag,"parseMsgOutput.txt",DataSaveUtil.FILE); socket.close(); }catch(Exception e){ e.printStackTrace(); } } }
public static Msg8583Util ParseMessage(byte[] msg, String filePath){ int i,msgPos=0; int len=0; byte[][] msgDat = new byte[65][1024]; Msg8583Util msgParseApp = new Msg8583Util(); byte[] bitmap = new byte[8]; System.arraycopy(msg,0,bitmap,0,8); byte[] bt64 = ParseBitMap(bitmap); msgPos = 8; for(i=1;i<=64;i++) { if(bt64[i-1]=='1'){ len = getBitMapType(i,filePath); switch(len) { case Msg8583Util.TYPE_LLVAR: len = ToolUtil.bytesToInt(msg[msgPos]); msgPos += 1; break; case Msg8583Util.TYPE_BCDLLVAR: len = ToolUtil.bytesToInt(msg[msgPos])/2; msgPos += 1; break; case Msg8583Util.TYPE_LLLVAR: len = ToolUtil.bytesToInt(msg[msgPos]) * 100 + ToolUtil.bytesToInt(msg[msgPos+1]); msgPos += 2; break; case Msg8583Util.TYPE_BCDLLLVAR: len = ToolUtil.bytesToInt(msg[msgPos]) * 100 + ToolUtil.bytesToInt(msg[msgPos+1]); len = len /2; msgPos += 2; break; default: break; } System.arraycopy(msg,msgPos,msgDat[i],0,len); msgPos += len; msgParseApp.setBitValue(i,len,msgDat[i]); // ToolUtil.TraceHexString(i,msgDat[i],len); } } return msgParseApp; }