zoukankan      html  css  js  c++  java
  • web socket多线程实时监听

    配置文件:

    web.xml文件:
    <!-- socket 监听 -->
       <context-param>
        <param-name>socketPort</param-name>
        <param-value>8888</param-value>
      </context-param>
      <listener>
        <description>Socket</description>
        <listener-class>com.demo.modules.intf.listener.ServerSocketListener</listener-class>
      </listener>
    View Code

    代码:

    package com.demo.modules.intf.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import com.demo.intf.util.SocketThread;
    
    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(); 
            }
        }
    }
    
    
    ----------------------------
    
    
    package com.demo.intf.util;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;
    
    import javax.servlet.ServletContext;
    
    public 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
            {
                
                Socket client = null;  
                //通过调用Executors类的静态方法,创建一个ExecutorService实例  
                //ExecutorService接口是Executor接口的子接口  
                Executor service = Executors.newCachedThreadPool();  
                Integer count = 0;
                while (!this.isInterrupted())
                {
                    client = serverSocket.accept();
                    count++;
                    System.out.println("Server SocketThread start:"+count);
                    if (client != null)
                    {
                        //调用execute()方法时,如果必要,会创建一个新的线程来处理任务,但它首先会尝试使用已有的线程,  
                        //如果一个线程空闲60秒以上,则将其移除线程池;  
                        //另外,任务是在Executor的内部排队,而不是在网络中排队  
                        service.execute(new ServerThread(client)); 
                    }
                }
            }
            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());
            }
        }
    }
    View Code
  • 相关阅读:
    个人阅读笔记05—数据流图
    JVM(三)程序计数器【PC寄存器】
    JVM(三)运行时数据区的概述,线程概述
    JVM(二)表示两个Class对象是否为同一个类;Java程序对类的使用
    我的面试经之JVM(二)双亲委派机制
    我的面试经之JVM(二) ClassLoader补充【获取类的加载器的方式】
    我的面试经之JVM(二)类加载器的分类
    我的面试经之JVM(二)类加载器子系统ClassLoader类的加载过程
    Python小白要了解的模块大概用途(随学习进度更新),import xxxx
    Python常见的模块(知乎转载)
  • 原文地址:https://www.cnblogs.com/ice-line/p/5646390.html
Copyright © 2011-2022 走看看