BankSocket.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.hywa.banktest.bankframework.socketHandle;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.PrintWriter;
  8. import java.io.UnsupportedEncodingException;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. import javax.annotation.PostConstruct;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.scheduling.annotation.Async;
  14. import org.springframework.stereotype.Component;
  15. import com.hywa.banktest.bankframework.pack.Dlmaps;
  16. import com.hywa.banktest.bankframework.schedule.BankRequsetProcess;
  17. import com.hywa.banktest.bankframework.utils.XmlUtils;
  18. import com.hywa.banktest.kit.SpringContext;
  19. import com.hywa.banktest.service.impl.OrderInfoServiceImpl;
  20. import lombok.extern.slf4j.Slf4j;
  21. @Slf4j
  22. @Component
  23. public class BankSocket {
  24. @Value("${bank.post.socket.server.address}")
  25. String serverAddr;
  26. @Value("${bank.post.socket.server.port}")
  27. int serverPort;
  28. @Value("${local.post.socket.port}")
  29. int localSocketPort;
  30. public Dlmaps query(Dlmaps requestPacket) {
  31. Socket socket = null;
  32. BufferedReader br = null;
  33. InputStream is = null;
  34. PrintWriter pw = null;
  35. OutputStream os = null;
  36. StringBuffer result = new StringBuffer();
  37. try {
  38. socket = new Socket(serverAddr, serverPort);
  39. //socket.setSoTimeout(1000 * 58);
  40. os = socket.getOutputStream();
  41. pw = new PrintWriter(os, true);
  42. String requestStr = dlmaps2RequestStr(requestPacket);
  43. log.info("发送报文:" + requestStr);
  44. pw.write(requestStr);
  45. pw.flush();
  46. // socket.shutdownOutput();
  47. is = socket.getInputStream();
  48. result.append(inputStream2Str(is));
  49. log.error("收到响应报文:" + result);
  50. log.info("收到响应报文:" + result);
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. } finally {
  54. closeAll(socket, br, is, pw, os);
  55. }
  56. result.delete(0, result.indexOf("<"));
  57. result.delete(result.indexOf("***"), result.length());
  58. return XmlUtils.fromXML(result.toString(), Dlmaps.class);
  59. }
  60. // @PostConstruct
  61. public void socketServer() {
  62. new Thread(() -> {
  63. ServerSocket serverSocket = null;
  64. BufferedReader br = null;
  65. OutputStream os = null;
  66. PrintWriter pw = null;
  67. InputStream is = null;
  68. try {
  69. serverSocket = new ServerSocket(localSocketPort);
  70. System.err.println("socket server started");
  71. Socket socket = null;
  72. while (true) {
  73. try {
  74. socket = serverSocket.accept();
  75. is = socket.getInputStream();
  76. br = new BufferedReader(new InputStreamReader(is));
  77. StringBuffer result = new StringBuffer(inputStream2Str(is));
  78. log.info("服务端收到报文:" + result);
  79. result.delete(0, result.indexOf("<"));
  80. if (result.toString().contains("***"))
  81. result.delete(result.indexOf("***"), result.length());
  82. log.info("服务端处理xml报文:" + result);
  83. Dlmaps dlmaps = XmlUtils.fromXML(result.toString(), Dlmaps.class);
  84. BankRequsetProcess bankRequsetProcess = (BankRequsetProcess) SpringContext.getBean("bankRequsetProcess");
  85. Dlmaps resultDlmaps = bankRequsetProcess.process(dlmaps);
  86. if ("8900".equals(dlmaps.getPUB().getTRADE_ID() )){
  87. resultDlmaps.setIN(null);
  88. }
  89. os = socket.getOutputStream();
  90. pw = new PrintWriter(os);
  91. String resStr = dlmaps2RequestStr(resultDlmaps);
  92. pw.write(resStr);
  93. pw.flush();
  94. } catch (Exception e) {//统一catch Exception防止跳出serverSocket. 另一种解决办法是线程处理客户端socket对象
  95. e.printStackTrace();
  96. } finally {
  97. closeAll(socket, br, is, pw, os);
  98. }
  99. }
  100. } catch (Exception e1) {
  101. e1.printStackTrace();
  102. } finally {
  103. if (null != serverSocket) {
  104. try {
  105. serverSocket.close();
  106. } catch (IOException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. }
  111. }).start();
  112. }
  113. private String inputStream2Str(InputStream is) throws IOException {
  114. byte[] readbuf = new byte[4];
  115. is.read(readbuf);
  116. String str = new String(readbuf, 0, readbuf.length, "UTF-8");
  117. Integer msglen = Integer.parseInt(str);
  118. readbuf = new byte[msglen];
  119. // readbuf = new byte[1024];
  120. is.read(readbuf);
  121. String reciveString = new String(readbuf, 0, readbuf.length, "UTF-8");
  122. return String.format("%04d", msglen) + reciveString;
  123. }
  124. private String dlmaps2RequestStr(Dlmaps requestPacket) throws UnsupportedEncodingException {
  125. String xmlRequest = XmlUtils.toXML(requestPacket);
  126. StringBuffer requestPac = new StringBuffer();
  127. requestPac.append("TEB").append(requestPacket.getPUB().getTRADE_ID()).append(requestPacket.getPUB().getDPT_ID()).append(xmlRequest);
  128. StringBuffer requestStr = new StringBuffer(String.format("%04d", requestPac.toString().getBytes("UTF-8").length + 3)).append(requestPac).append("***");
  129. return requestStr.toString();
  130. }
  131. private void closeAll(Socket socket, BufferedReader br, InputStream is, PrintWriter pw, OutputStream os) {
  132. if (null != br) {
  133. try {
  134. br.close();
  135. } catch (IOException e) {
  136. e.printStackTrace();
  137. }
  138. }
  139. if (null != is) {
  140. try {
  141. is.close();
  142. } catch (IOException e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. if (null != pw) {
  147. pw.close();
  148. }
  149. if (null != os) {
  150. try {
  151. os.close();
  152. } catch (IOException e) {
  153. e.printStackTrace();
  154. }
  155. }
  156. if (null != socket) {
  157. try {
  158. socket.close();
  159. } catch (IOException e) {
  160. e.printStackTrace();
  161. }
  162. }
  163. }
  164. }