package com.yinxin.jtyh.controller;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.SocketException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.yinxin.jtyh.entity.GjjPersonInfoEntity;
import com.yinxin.jtyh.service.PersonInfoService;
import com.yinxin.jtyh.tools.SpringUtil;
public class ServerConfig extends Thread{
private Socket socket;
private static final Log LOG = LogFactory.getLog(ServerConfig.class);
public ServerConfig(Socket socket) {
this.socket = socket;
}
private PersonInfoService gjj = SpringUtil.getBean(PersonInfoService.class);
private String hanle(InputStream stream) {
byte[] bytes = new byte[1024];
int len = 0;
try {
len = stream.read(bytes);
} catch (IOException e) {
LOG.error("连接超时: " + e.getMessage());
}
GjjPersonInfoEntity gjjEntity = null;
if(len != -1) {
String req = null;
try {
req = new String(bytes,0,len,"UTF-8");
LOG.info("<--------------------------------------接收到的请求信息: " + req);
} catch (UnsupportedEncodingException e) {
LOG.error("请求信息转换为字符串出错: " + e.getMessage());
}
// 提取入参中的必要字段作为查询条件
String[] reqs = req.replace("\"","").split("\\|");
String IdNo = reqs[4].trim();
String CusName = reqs[2];
LOG.info("被查询人姓名和证件号码: " + CusName + ":" + IdNo);
gjjEntity = gjj.selectPersonInfoByName(IdNo, CusName);
if(gjjEntity == null) {
return "查询结果为null";
}
}
LOG.info("<----------------------------响应数据: " + gjjEntity.toString());
return gjjEntity.toString();
}
@Override
public void run() {
BufferedWriter writer = null;
try {
socket.setSoTimeout(9000);
LOG.info("银行端" + socket.getRemoteSocketAddress() + "机连接成功------------------------------------------->");
InputStream input = socket.getInputStream();
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
String result = null;
try {
result = hanle(input);
writer.write(result);
writer.newLine();
writer.flush();
}catch(Exception e) {
writer.newLine();
writer.flush();
LOG.info("输出数据时出错: " + e.getMessage());
}
} catch (SocketException e) {
LOG.error("连接超时异常: " + e.getMessage());
} catch (IOException e) {
LOG.error("获取输入信息流异常: " + e.getMessage());
}finally {
try {
writer.close();
}catch(Exception e) {
LOG.error("输出流关闭异常: " + e.getMessage());
}
}
}
}
package com.yinxin.jtyh.controller;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.websocket.server.ServerEndpoint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class BCMRunner implements CommandLineRunner{
// 端口
@Value("${socket.port}")
private Integer port;
//核心线程数
@Value("${socket.poolCore}")
private Integer poolCore;
// 最大连接数
@Value("${socket.poolMax}")
private Integer poolMax;
// 保持线程数
@Value("${socket.poolKeep}")
private Integer poolKeep;
// 队列容量
@Value("${socket.poolQueueInit}")
private Integer poolQueueInit;
@Override
public void run(String... args) throws Exception {
ServerSocket server = null;
Socket socket = null;
server = new ServerSocket(port);
System.out.println("设备服务器已经开启,监听端口: " + port);
ThreadPoolExecutor pool = new ThreadPoolExecutor(poolCore, poolMax, poolKeep, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(poolQueueInit),new ThreadPoolExecutor.DiscardOldestPolicy());
while(true){
socket = server.accept();
pool.execute(new ServerConfig(socket));
}
}
}