启动类
public static void main(String[] args) {
SpringApplication.run(ZSClientApplication.class, args);
System.out.println("Client OK");
try {
ZSServerSocket zsServerSocket = new ZSServerSocket();
System.out.println("Seriver OK");
zsServerSocket.service();
} catch (IOException e) {
e.printStackTrace();
}
}
//socket服务类
public class ZSServerSocket {
private ServerSocket serverSocket;
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 2;// 单个CPU线程池大小
private Socket socket;
public ZSServerSocket() throws IOException{
serverSocket = new ServerSocket(port);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors()
* POOL_SIZE);
log.info("服务器启动:" + port);
}
public void service(){
while (true) {
try {
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
executorService.execute(new Runnable() {
@Override
public void run() {
//业务逻辑请求处理报文
DataInputStream din = null;
DataOutputStream dout = null;
try{
dout = new DataOutputStream(socket
.getOutputStream());
din = new DataInputStream(socket.getInputStream());
log.info("新连接" + socket.getInetAddress() + ":"
+ socket.getPort());
byte []bLen = new byte[8];
din.read(bLen);
int len = Integer.valueOf(new String(bLen));
log.info("接收报文长度:" + len);
byte[] bContent = new byte[len];
din.read(bContent);
String msg = new String(bContent, "GBK");
msg = msg.trim();
String origData =getbody(msg,"body");
origData.trim();
log.info("原文:[" + origData + "]");
String signedData = getbody(msg,"bz1");
log.info("密文:[" + signedData + "]");
//sm2国密验签与RSA验签均支持
String deviceName = JCrypto.JSOFT_LIB;
JCrypto.getInstance().initialize(deviceName, null);
Session session = JCrypto.getInstance().openSession(deviceName);
boolean result = SignVerUtils.verify(origData.getBytes(),signedData.getBytes(),session);
log.info("验签结果:"+result);
if(!result){
log.error("验签失败");
}
//解析报文
SAXReader reader = new SAXReader();
Document recDoc = reader.read((new ByteArrayInputStream(bContent)));
Element recRootEmt = recDoc.getRootElement();
Element recHeadEmt = recRootEmt.element("head");
Element recBodyEmt = recRootEmt.element("body");
String jym = recHeadEmt.element("jym").getText();
if("1003".equals(jym)){
//出入金文件名
String crjwjm = recBodyEmt.element("crjwjm").getText();
//交易文件名
String jywjm = recBodyEmt.element("jywjm").getText();
//账务日期
String zwrq = recBodyEmt.element("zwrq").getText();
//回单清单文件名
String hdqdwjm = recBodyEmt.element("hdqdwjm").getText();
//保存文件名,以供下载使用
FlowFile flowFile = new FlowFile();
flowFile.setCreatetime(new Date());
flowFile.setUpdatetime(new Date());
flowFile.setCrjwj(crjwjm);
flowFile.setJywj(jywjm);
flowFile.setZwrq(zwrq);
flowFile.setHdqdwj(hdqdwjm);
zsDao.save(flowFile);
//返回报文
Request request = new Request();
Head head = new Head();
Body body = new Body();
SimpleDateFormat Jyrq = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat Jysj = new SimpleDateFormat("HHmmss");
head.setJym(jym);
head.setSclsh(thirdLogNo2());
head.setScbh(scbh);
head.setFhm("000000");
head.setBz1("");
head.setJyrq(Jyrq.format(new Date()));
head.setJysj(Jysj.format(new Date()));
request.setHead(head);
request.setBody(body);
XStream xs = new XStream();
xs.alias("request",Request.class);
xs.alias("head",Head.class);
xs.alias("body",Body.class);
String requestXml = XML_HEAD_GBK + xs.toXML(request);
Document doc = reader.read(new ByteArrayInputStream(requestXml.getBytes()));
String rmsg = "";
rmsg = doc.asXML();
rmsg = rmsg.trim();
int retLen = rmsg.length();
String sRetLen = (String.valueOf(100000000+retLen)).substring(1, 9);
log.info("返回信息长度:" + sRetLen);
log.info("返回信息:"+ requestXml);
byte[] bRetlen = sRetLen.getBytes();
byte[] bRetStr = rmsg.getBytes("GBK");
dout.write(bRetlen);
dout.write(bRetStr);
}
}
});
} catch (Exception e) {
log.error("线程内部错误", e);
}
}
}
}