1、新建web工程
2、自定义类 实现ServletContextListener 接口
在contextInitialized方法中启动socket服务的线程
在contextDestroyed方法中关闭socket线程的服务,释放监听端口
3、更改web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_IDsocket Server</display-name> <context-param> <param-name>socketPort</param-name> <param-value>8888</param-value> </context-param> <listener> <description>Socket</description> <listener-class>myserver.ServerSocketListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
4、tomcat发布服务即可
注:需进入servlet-api.jar包
附示例代码
public class ServerSocketListener 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(); System.out.println("Server contextInitialized over"); if (socketThread == null) { socketThread = new SocketThread(null, servletContext); socketThread.start(); } } }
class SocketThread extends Thread { Integer count = 0; 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() { try { Integer count = 0; while (!this.isInterrupted()) { MyServer.rerfresh(); Socket socket = serverSocket.accept(); count++; System.out.println("Server SocketThread start:"+count); if (socket != null) { SocketClientBean client = new SocketClientBean(); client.setSocket(socket); MyServer.clientlist.add(client); System.out.println("new commer:"+socket.getRemoteSocketAddress().toString()); MyServer.invoke(socket); } } } catch (Exception ex) { System.out.println("SocketThread err:"+ex.getMessage()); } } public void closeServerSocket() { try { if (serverSocket != null && !serverSocket.isClosed()) { serverSocket.close(); MyServer.destroyedTimer(); } } catch (Exception ex) { System.out.println("SocketThread err:"+ex.getMessage()); } } }
public class MyServer { public static List<SocketClientBean> clientlist = new ArrayList<SocketClientBean>();private static Timer timer = new Timer(); public static void rerfresh() { timer.schedule(new MyClientRefreshTask(), 1000*0, 1000*15); } public static void destroyedTimer() { if(timer1!=null) { timer1.cancel(); } if(timer!=null) { timer.cancel(); } } public static void invoke(final Socket client) throws IOException { new Thread(new Runnable() { public void run() { String errcmd = "{"cmd":-1}"; String nocmd = "{"cmd":0}"; BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader( client.getInputStream())); out = new PrintWriter(client.getOutputStream()); Integer count = 0; while (true) { String cmdmsg = in.readLine(); count++; System.out.println(count); System.out.println("Server received " + cmdmsg); JSONObject jsmsg = JSONObject.fromObject(cmdmsg); System.out.println("JSONObject success"); String cmd = jsmsg.getString("cmd"); switch (cmd) { case "1": com.progress.cmd1.process(client, jsmsg); break; case "2": com.progress.cmd2.process(client, jsmsg); break;default: out.println(nocmd); out.flush(); } if (cmdmsg.equals("bye")) { break; } } } catch (JSONException ex) { System.out.println("JSONObject err"); out.println(errcmd); out.flush(); } catch (Exception ex) { ex.printStackTrace(); } finally { try { in.close(); } catch (Exception e) { } try { out.close(); } catch (Exception e) { } try { client.close(); } catch (Exception e) { } } } }).start(); } static class MyClientRefreshTask extends java.util.TimerTask { public void run() { refreshClient(); } } private static void refreshClient() { List<SocketClientBean> dels = new ArrayList<SocketClientBean>(); for (int i = 0; i < MyServer.clientlist.size(); i++) { if (MyServer.clientlist.get(i).getSocket().isClosed()) { System.out.println("it is the del client!"); dels.add(clientlist.get(i)); } } System.out.println("clientlist num:"+clientlist.size()); System.out.println("dels num:"+dels.size()); clientlist.removeAll(dels); System.out.println("clientlist left num:"+clientlist.size()); } }