项目启动开启socket服务

来源:互联网 发布:金日十数据 编辑:程序博客网 时间:2024/04/30 14:55

Web项目中需要在项目启动时开启socket服务

用于收发消息

1.web.xml中配置

端口号为9999的socket 服务端,添加监听

<context-param>
<param-name>socketPort</param-name>
<param-value>9999</param-value>
 </context-param>
<listener>
<description>Socket服务随web启动而启动</description>
<listener-class>com.util.Mylistener</listener-class>
</listener>

2.监听类

单开一个线程,负责socket

public class Mylistener implements ServletContextListener{
private SocketThread socketThread; 

public void contextDestroyed(ServletContextEvent e){ 
if(socketThread!=null && socketThread.isInterrupted()){ 
socketThread.closeServerSocket();
socketThread.interrupt();
}

public void contextInitialized(ServletContextEvent e){ 
ServletContext servletContext = e.getServletContext();
if(servletContext!=null && socketThread==null){ 
socketThread=new SocketThread(null,servletContext); 
socketThread.start();
}
}
}

3.socket线程

public 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 SocketData(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();
}
}
}

0 0