You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.3 KiB
Java

2 years ago
package com.engine.web.tjbk;
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;
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();
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);
}
}
}