package com.hywa.banktest.bankframework.socketHandle; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import com.hywa.banktest.bankframework.pack.Dlmaps; import com.hywa.banktest.bankframework.schedule.BankRequsetProcess; import com.hywa.banktest.bankframework.utils.XmlUtils; import com.hywa.banktest.kit.SpringContext; import com.hywa.banktest.service.impl.OrderInfoServiceImpl; import lombok.extern.slf4j.Slf4j; @Slf4j @Component public class BankSocket { @Value("${bank.post.socket.server.address}") String serverAddr; @Value("${bank.post.socket.server.port}") int serverPort; @Value("${local.post.socket.port}") int localSocketPort; public Dlmaps query(Dlmaps requestPacket) { Socket socket = null; BufferedReader br = null; InputStream is = null; PrintWriter pw = null; OutputStream os = null; StringBuffer result = new StringBuffer(); try { socket = new Socket(serverAddr, serverPort); //socket.setSoTimeout(1000 * 58); os = socket.getOutputStream(); pw = new PrintWriter(os, true); String requestStr = dlmaps2RequestStr(requestPacket); log.info("发送报文:" + requestStr); pw.write(requestStr); pw.flush(); // socket.shutdownOutput(); is = socket.getInputStream(); result.append(inputStream2Str(is)); log.error("收到响应报文:" + result); log.info("收到响应报文:" + result); } catch (IOException e) { e.printStackTrace(); } finally { closeAll(socket, br, is, pw, os); } result.delete(0, result.indexOf("<")); result.delete(result.indexOf("***"), result.length()); return XmlUtils.fromXML(result.toString(), Dlmaps.class); } // @PostConstruct public void socketServer() { new Thread(() -> { ServerSocket serverSocket = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; InputStream is = null; try { serverSocket = new ServerSocket(localSocketPort); System.err.println("socket server started"); Socket socket = null; while (true) { try { socket = serverSocket.accept(); is = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); StringBuffer result = new StringBuffer(inputStream2Str(is)); log.info("服务端收到报文:" + result); result.delete(0, result.indexOf("<")); if (result.toString().contains("***")) result.delete(result.indexOf("***"), result.length()); log.info("服务端处理xml报文:" + result); Dlmaps dlmaps = XmlUtils.fromXML(result.toString(), Dlmaps.class); BankRequsetProcess bankRequsetProcess = (BankRequsetProcess) SpringContext.getBean("bankRequsetProcess"); Dlmaps resultDlmaps = bankRequsetProcess.process(dlmaps); if ("8900".equals(dlmaps.getPUB().getTRADE_ID() )){ resultDlmaps.setIN(null); } os = socket.getOutputStream(); pw = new PrintWriter(os); String resStr = dlmaps2RequestStr(resultDlmaps); pw.write(resStr); pw.flush(); } catch (Exception e) {//统一catch Exception防止跳出serverSocket. 另一种解决办法是线程处理客户端socket对象 e.printStackTrace(); } finally { closeAll(socket, br, is, pw, os); } } } catch (Exception e1) { e1.printStackTrace(); } finally { if (null != serverSocket) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } private String inputStream2Str(InputStream is) throws IOException { byte[] readbuf = new byte[4]; is.read(readbuf); String str = new String(readbuf, 0, readbuf.length, "UTF-8"); Integer msglen = Integer.parseInt(str); readbuf = new byte[msglen]; // readbuf = new byte[1024]; is.read(readbuf); String reciveString = new String(readbuf, 0, readbuf.length, "UTF-8"); return String.format("%04d", msglen) + reciveString; } private String dlmaps2RequestStr(Dlmaps requestPacket) throws UnsupportedEncodingException { String xmlRequest = XmlUtils.toXML(requestPacket); StringBuffer requestPac = new StringBuffer(); requestPac.append("TEB").append(requestPacket.getPUB().getTRADE_ID()).append(requestPacket.getPUB().getDPT_ID()).append(xmlRequest); StringBuffer requestStr = new StringBuffer(String.format("%04d", requestPac.toString().getBytes("UTF-8").length + 3)).append(requestPac).append("***"); return requestStr.toString(); } private void closeAll(Socket socket, BufferedReader br, InputStream is, PrintWriter pw, OutputStream os) { if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != pw) { pw.close(); } if (null != os) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != socket) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }