123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- 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();
- }
- }
- }
-
- }
|