WEB服务器启动时加载ServerSocket服务

如果在项目中需要让一个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();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值