关于java web 启动socket

这是自己从网上找到的主要实现方法,记录方便以后查看,也方便一些像我一样的新手参考。

第一,首先的实现接口 ServletContextListener 启动服务线程

import javax.servlet.ServletContext;  
import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;


public class SocketListener implements ServletContextListener{
	  //socket server 线程  
    private SocketThread socketThread;  
      
    @Override  
    public void contextDestroyed(ServletContextEvent arg0) {  
        if(null!=socketThread && !socketThread.isInterrupted())  
           {  
            socketThread.closeSocketServer();  
            socketThread.interrupt();  
           }  
    }  
  
    @Override  
    public void contextInitialized(ServletContextEvent arg0) {  
        // TODO Auto-generated method stub  
        if(null==socketThread)  
        {  
         ServletContext servletContext = arg0.getServletContext();
         //新建线程类  
         socketThread=new SocketThread(null, servletContext);  
         //启动线程  
         socketThread.start();  
        }  
    }
}

<pre name="code" class="java">//第二,实现线程类并启动socket监听
 
import java.net.ServerSocket;  
import java.net.Socket;  
import java.net.InetAddress;
import javax.servlet.ServletContext; 

/** 
 * socket 线程类 
 * 
 */

public class SocketThread extends Thread {
	 private ServerSocket serverSocket = null;  
	 private ServletContext servletContext;
	 private int count = 0;
	 /*
	  * 构造并开始socket服务
	  */
	    public SocketThread(ServerSocket serverScoket, ServletContext servletContext){ 
	    	this.servletContext = servletContext;
	    	// 从web.xml中context-param节点获取socket端口
	        int port = Integer.parseInt(this.servletContext.getInitParameter("socketPort"));
	        int backlog = Integer.parseInt(this.servletContext.getInitParameter("maxListen"));
	        String ip = this.servletContext.getInitParameter("socketIP");
	        try {  
	            if(null == serverSocket){  
	                this.serverSocket = new ServerSocket(port, backlog, InetAddress.getByName(ip));  
	                System.out.println("socket start");  
	            }  
	        } catch (Exception e) {  
	            System.out.println("SocketThread创建socket服务出错");  
	            e.printStackTrace();  
	        }  
	  
	    }  
	   
	    /*
	     * (non-Javadoc)
	     * @see java.lang.Thread#run()
	     * 等待接受客户端连接
	     */
	    public void run(){ 
	    	 System.out.println("开始受连接。。。");
	        while(!this.isInterrupted()){  
	            try {  
	                Socket socket = serverSocket.accept();  
	                  
	                if(null != socket && !socket.isClosed()){     
	                    //接收客户端连接开启一个线程处理接收的数据  
	                	count++;
	                    new SocketOperate(socket, count).start();  
	                }  
	                socket.setSoTimeout(30000);  
	                  
	            }catch (Exception e) {  
	                e.printStackTrace();  
	            }  
	        }  
	    }  
	      
	      
	    public void closeSocketServer(){  
	       try {  
	            if(null!=serverSocket && !serverSocket.isClosed())  
	            {  
	             serverSocket.close();  
	            }  
	       } catch (IOException e) {  
	        // TODO Auto-generated catch block  
	        e.printStackTrace();  
	       }  
	     }  
}


 第三,实现处理客户端会话线程类 

import java.io.IOException;  
import java.io.InputStream;  
//import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.Socket;  
  
//import javax.servlet.ServletContext; 

/** 
 * socket 线程类 
 * 
 */

public class SocketOperate extends Thread {
	private Socket socket; 
	
	private int num = 0;
    
    public SocketOperate(Socket socket, int _num) {  
       this.socket=socket;
       this.num = _num;
    }  
    @SuppressWarnings("unused")  
   public void run()  
    {  
        try{     
               InputStream in= socket.getInputStream();    
               PrintWriter out=new PrintWriter(socket.getOutputStream());    
 
               //BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
               String info = "线程" + String.valueOf(num) + ":开始接收数据...";
               System.out.println(info);
               while(true){ 
            	  
                   //读取客户端发送的信息  
                   String strXML = "";  
                   int count = 0;  
                   while (count == 0) {  
                       count = in.available();  
                   }  
                   byte[] b = new byte[count];  
                   in.read(b); 
                   strXML = new String(b,0,count);  
                   
                   //收到退出,关闭服务
                   if(strXML.equals("exit")){ 
                	   info = "客户端" + String.valueOf(num) + ":断开连接。";
                       System.out.println(info);  
                       break;   
                   }  
                   if(strXML.equals(""))  
                       continue;
                   
                   info = "客户端" + String.valueOf(num) + "发来:" + strXML.toString();
                   System.out.println(info);   
                   /* 
                   MethodHandler mh = new MethodHandler(ReadXML.readXML(strXML.toString()));  
                   String resultXML = mh.getResultXML();  
                   System.out.println("返回:"+resultXML.toString());  
                     
                     
                   if(!"".equals(resultXML)){  
                       out.print(resultXML);  
                       out.flush();   
                       out.close();  
                   }  
 					*/  
                  
               }   //end while  
               socket.close();     
               System.out.println("socket stop.....");  
 
           }catch(IOException ex){     
        	   	ex.printStackTrace();
           }finally{     
               
           }     
    }  
}


第四,对web.xml 进行配置

   <!-- socket 参数 -->
  <context-param>
    <param-name>socketPort</param-name>
    <param-value>9090</param-value>
  </context-param>
  
   <context-param>
    <param-name>socketIP</param-name>
    <param-value>192.168.1.133</param-value>
  </context-param>
  
     <context-param>
    <param-name>maxListen</param-name>
    <param-value>10</param-value>
  </context-param>
   
      <!-- 开启socket服务 -->  
      
<listener>  
  <listener-class>com.cjh.socket.SocketListener</listener-class>  
</listener>

记录完毕。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值