package com.engine.web.tjbk; import com.engine.tjbankSocket.SocketExecute; import com.engine.tjbankSocket.impl.GetToCountSocketExecute; import com.engine.util.XMLUtils; import weaver.general.BaseBean; import weaver.general.StringUtil; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.Map; public class TjbkServerSocket implements ServletContextListener { private SocketThread socketThread; @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub if (socketThread != null && socketThread.isInterrupted()) { socketThread.closeServerSocket(); socketThread.interrupt(); } } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub ServletContext servletContext = arg0.getServletContext(); if (socketThread == null) { socketThread = new SocketThread(null, servletContext); socketThread.start(); // servlet上下文初始化时启动socket服务端线程 } } } class SocketThread extends Thread { private ServletContext servletContext; private ServerSocket serverSocket; public SocketThread(ServerSocket serverSocket, ServletContext servletContext) { this.servletContext = servletContext; // 从web.xml中context-param节点获取socket端口 String port = this.servletContext.getInitParameter("socketPort"); if (serverSocket == null) { try { this.serverSocket = new ServerSocket(Integer.parseInt(port)); } catch (IOException e) { e.printStackTrace(); } } } @Override public void run() { while (!this.isInterrupted()) { // 线程未中断执行循环 try { Socket socket = serverSocket.accept(); if (socket != null) { new ProcessSocketData(socket, this.servletContext).start(); } } catch (IOException e) { e.printStackTrace(); } } } public void closeServerSocket() { try { if (serverSocket != null && !serverSocket.isClosed()) { serverSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } } class ProcessSocketData extends Thread { private Socket socket; private ServletContext servletContext; public ProcessSocketData() { super(); } public ProcessSocketData(Socket socket, ServletContext servletContext) { this.socket = socket; this.servletContext = servletContext; } @Override public void run() { try { // BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); new BaseBean().writeLog("ServerSocket线程启动"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8); PrintWriter pw = new PrintWriter(outputStreamWriter); InputStream inputStream = socket.getInputStream(); // byte[] arr = new byte[1024]; // int length = inputStream.read(arr);//返回有效数据长度 byte[] arr = new byte[1024]; int bytesRead; StringBuilder stringBuilder = new StringBuilder(); while ((bytesRead = inputStream.read(arr)) != -1) { // bytesRead contains the number of bytes read from the input stream stringBuilder.append(new String(arr, 0, bytesRead, StandardCharsets.UTF_8)); } // String data = new String(arr, 0, length); String requestData = stringBuilder.toString(); new BaseBean().writeLog("ServerSocket线程启动"); String s = ""; if (!StringUtil.isEmpty(requestData)) { s = new TJBKWorkFlow().getToDoCount(requestData); } // 执行自定义的请求解析方法,生成响应response pw.println(s); pw.flush(); // 刷新缓冲区 pw.close(); socket.close(); // System.out.println(sb); } catch (IOException e) { e.printStackTrace(); System.out.println(e); } } private String execute(String XMLparam){ Map paramMap = XMLUtils.parseXMLToMap(XMLparam); //目标系统代码 String system_id = paramMap.get("system_id"); // 请求方系统代码 String requester_id = paramMap.get("requester_id"); // 请求方机构代号 String branch_id = paramMap.get("branch_id"); SocketExecute socketExecute = null; if ("1".equals(requester_id)){ socketExecute = new GetToCountSocketExecute(); } String execute = socketExecute.execute(XMLparam); return execute; } }