zoukankan      html  css  js  c++  java
  • java web工程启动socket服务

    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());
        }
    
    }
  • 相关阅读:
    从零开始学VUE之组件化开发(组件数据的存放)
    从零开始学VUE之组件化开发(组件分离写法)
    从零开始学VUE之组件化开发(语法糖优化组件注册)
    进程与线程的一个简单解释
    Crontab爬虫定时执行
    接口分类复习
    最长公共子串
    最长公共子序列(力扣第1143题)
    Reduce端分组排序源码分析
    Job提交流程源码和切片源码详解
  • 原文地址:https://www.cnblogs.com/w-y-f/p/3289632.html
Copyright © 2011-2022 走看看