如果在项目中需要让一个ServerSocket 服务伴随WEB 服务器的启动而启动,时刻监控某个
端口,接收Socket 客户端发送过来的socket 报文。需要做以下配置,配置完成后程序支持
随服务器启动,支持同时处理多个socket 客户端请求。
1.配置web.xml
在web.xml 的节点中添加以下内容:
<context-param>
<param-name>socketPort</param-name>
<param-value>3800</param-value>
</context-param>
<listener>
<description>Socket 服务随web 启动而启动</description>
<listener-class>service.ServerSocketListener</listener-class>
</listener>
2.编写监听器Listener 中配置的类
package cn.cjoy.serversocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServerSocketListener 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();
}
}
}
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;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream());
String request = br.readLine(); // 从流中读取请求消息报文
// 执行自定义的请求解析方法,生成响应response
//pw.println(response);
//pw.flush(); // 刷新缓冲区
System.out.println(request);
} catch (IOException e) {
e.printStackTrace();
}
}
}