ServerSocket
WEBWEBWEBWEB 服务器启动时加载一个 ServerSocket
ServerSocket
ServerSocket 服务
yunfeiyang08@gmail.com
如果在项目中需要让一个 ServerSocket 服务伴随 WEB 服务器的启动而启动,时刻监控某个
端口,接收 Socket 客户端发送过来的 socket 报文。需要做以下配置,配置完成后程序支持
随服务器启动,支持同时处理多个 socket 客户端请求。
1.配置 web.xml
在 web.xml 的节点中添加以下内容:
socketPort
3800
Socket 服务随 web 启动而启动
service.ServerSocketListener
注:网上也有人提出可以使用 servlet 节点进行配置,具体如下:
Test
service.ServerSocketServlet
3
这样做有一个很大的问题,就是服务器关闭时资源无法得到完全释放,端口可能仍然被占用
2.编写监听器 Listener 中配置的类
ServerSocketListener 类需要实现 ServletContextListener
class ServerSocketListener implements
implements ServletContextListener {
implements
class
public
public
class
implements
public class
public
private SocketThread socketThread;
private
private
private
public voidvoidvoidvoid contextDestroyed(ServletContextEvent e) {
public
public
public
ifififif (socketThread != nullnullnullnull && socketThread.isInterrupted()) {
socketThread.closeServerSocket();
socketThread.interrupt();
}
}
public voidvoidvoidvoid contextInitialized(ServletContextEvent e) {
public
public
public
ServletContext servletContext = e.getServletContext();
ifififif (str == nullnullnullnull && socketThread == nullnullnullnull) {
socketThread = newnewnewnew SocketThread(nullnullnullnull, servletContext);
socketThread.start(); // servlet上下文初始化时启动socket服务端线程
Page 1
yunfeiyang08@gmail.com
}
}
}
/**
* 自定义一个Socket线程类继承自线程类,重写run()方法,用于接收客户端socket请求报文
*/
class SocketThread extends
extends Thread {
extends
class
class
extends
class
private ServletContext servletContext;
private
private
private
private ServerSocket serverSocket;
private
private
private
public SocketThread(ServerSocket serverSocket, ServletContext servletContext) {
public
public
public
thisthisthisthis.servletContext = servletContext;
// 从web.xml中context-param节点获取socket端口
String port = thisthisthisthis.servletContext.getInitParameter("socketPort");
ifififif (serverSocket == nullnullnullnull) {
trytrytrytry {
thisthisthisthis.serverSocket = newnewnewnew ServerSocket(Integer.parseInt(port));
catch (IOException e) {
} catch
catch
catch
e.printStackTrace();
}
}
}
public voidvoidvoidvoid run() {
public
public
public
while (!thisthisthisthis.isInterrupted()) { // 线程未中断执行循环
while
while
while
trytrytrytry {
Socket socket = serverSocket.accept();
ifififif (socket != nullnullnullnull)
newnewnewnew ProcessSocketData(socket, thisthisthisthis.servletContext).start();
catch (IOException e) {
} catch
catch
catch
e.printStackTrace();
}
}
}
public voidvoidvoidvoid closeServerSocket() {
public
public
public
trytrytrytry {
ifififif (serverSocket != nullnullnullnull && !serverSocket.isClosed())
serverSocket.close();
catch (IOException e) {
} catch
catch
catch
e.printStackTrace();
}
}
}
Socket消息报文处理类
Page 2
yunfeiyang08@gmail.com
class ProcessSocketData extends
extends Thread {
extends
class
class
extends
class
private Socket socket;
private
private
private
private ServletContext servletContext;
private
private
private
public ProcessSocketData() {
public
public
public
super();
super
super
super
}
public ProcessSocketData(Socket socket, ServletContext servletContext) {
public
public
public
thisthisthisthis.socket = socket;
thisthisthisthis.servletContext = servletContext;
}
public voidvoidvoidvoid run() {
public
public
public
trytrytrytry {
BufferedReader br = newnewnewnew BufferedReader(newnewnewnew InputStreamReader(
socket.getInputStream()));
PrintWriter pw = newnewnewnew PrintWriter(socket.getOutputStream());
String request = br.readLine(); // 从流中读取请求消息报文
// 执行自定义的请求解析方法,生成响应response
pw.println(response);
pw.flush(); // 刷新缓冲区
} catch
catch (IOException e) {
catch
catch
e.printStackTrace();
}
}
}
3.一个简单的 Socket 客户端,用于验证以上程序
class TestClient {
class
public
public
class
public class
public
public voidvoidvoidvoid createSocketClient(String host, intintintint port) {
public
public
public
Socket socket = nullnullnullnull;
PrintWriter pw = nullnullnullnull;
BufferedReader br = null;
null;
null;
null;
trytrytrytry {
String request = "20110624";
socket = newnewnewnew Socket(host, port);
pw = newnewnewnew PrintWriter(newnewnewnew OutputStreamWriter(socket.getOutputStream()));
pw.println(request[i]);
pw.flush();
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
System.out.println(br.readLine());
} catch
catch (Exception e) {
catch
catch
e.printStackTrace();
}
Page 3
yunfeiyang08@gmail.com
}
static voidvoidvoidvoid main(String[] args) {
static
public
public
static
public static
public
TestClient client = newnewnewnew TestClient();
client.createSocketClient("127.0.0.1", 3800);
}
}
Page 4