java web 项目启动开启 socket server 作者:Mchange(好)



java web 项目启动开启 socket server 作者:Mchange

web.xml中配置监听

 

  1. <!– 开启socket服务 –>
  2. <listener>
  3.   <listener-class>com.ainong.socket.server.SocketServiceLoader</listener-class>
  4. </listener>

 

 

监听类

 

  1. import javax.servlet.ServletContext;
  2. import javax.servlet.ServletContextEvent;
  3. import javax.servlet.ServletContextListener;
  4. /**
  5.  * 将socket service随tomcat启动
  6.  * @author zhangzhongwen
  7.  *
  8.  */
  9. public class SocketServiceLoader implements ServletContextListener{
  10.     //socket server 线程
  11.     private SocketThread socketThread;
  12.     @Override
  13.     public void contextDestroyed(ServletContextEvent arg0) {
  14.         if(null!=socketThread && !socketThread.isInterrupted())
  15.            {
  16.             socketThread.closeSocketServer();
  17.             socketThread.interrupt();
  18.            }
  19.     }
  20.     @Override
  21.     public void contextInitialized(ServletContextEvent arg0) {
  22.         // TODO Auto-generated method stub
  23.         if(null==socketThread)
  24.         {
  25.          //新建线程类
  26.          socketThread=new SocketThread(null);
  27.          //启动线程
  28.          socketThread.start();
  29.         }
  30.     }
  31. }

 


 

 

生产socket线程类:

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import javax.servlet.ServletContext;
  8. /**
  9.  * socket 线程类
  10.  * @author zhangzhongwen
  11.  *
  12.  */
  13. public class SocketThread extends Thread{
  14.     private ServerSocket serverSocket = null;
  15.     public SocketThread(ServerSocket serverScoket){
  16.         try {
  17.             if(null == serverSocket){
  18.                 this.serverSocket = new ServerSocket(8877);
  19.                 System.out.println(“socket start”);
  20.             }
  21.         } catch (Exception e) {
  22.             System.out.println(“SocketThread创建socket服务出错”);
  23.             e.printStackTrace();
  24.         }
  25.     }
  26.     public void run(){
  27.         while(!this.isInterrupted()){
  28.             try {
  29.                 Socket socket = serverSocket.accept();
  30.                 if(null != socket && !socket.isClosed()){
  31.                     //处理接受的数据
  32.                     new SocketOperate(socket).start();
  33.                 }
  34.                 socket.setSoTimeout(30000);
  35.             }catch (Exception e) {
  36.                 e.printStackTrace();
  37.             }
  38.         }
  39.     }
  40.     public void closeSocketServer(){
  41.        try {
  42.             if(null!=serverSocket && !serverSocket.isClosed())
  43.             {
  44.              serverSocket.close();
  45.             }
  46.        } catch (IOException e) {
  47.         // TODO Auto-generated catch block
  48.         e.printStackTrace();
  49.        }
  50.      }
  51. }

 

 

处理客户端发送报文的类

 

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.Socket;
  7. import javax.servlet.ServletContext;
  8. /**
  9.  * 多线程处理socket接收的数据
  10.  * @author zhangzhongwen
  11.  *
  12.  */
  13. public class SocketOperate extends Thread{
  14.      private Socket socket;
  15.      public SocketOperate(Socket socket) {
  16.         this.socket=socket;
  17.      }
  18.      @SuppressWarnings(“unused”)
  19.     public void run()
  20.      {
  21.          try{
  22.                 InputStream in= socket.getInputStream();
  23.                 PrintWriter out=new PrintWriter(socket.getOutputStream());
  24.                 //BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
  25.                 while(true){
  26.                     //读取客户端发送的信息
  27.                     String strXML = ”";
  28.                     byte[] temp = new byte[1024];
  29.                     int  length = 0;
  30.                     while((length = in.read(temp)) != -1){
  31.                         strXML += new String(temp,0,length);
  32.                     }
  33.                     if(“end”.equals(strXML)){
  34.                         System.out.println(“准备关闭socket”);
  35.                         break;
  36.                     }
  37.                     if(“”.equals(strXML))
  38.                         continue;
  39.                     System.out.println(“客户端发来:”+strXML.toString());
  40.                     MethodHandler mh = new MethodHandler(ReadXML.readXML(strXML.toString()));
  41.                     String resultXML = mh.getResultXML();
  42.                     System.out.println(“返回:”+resultXML.toString());
  43.                     if(!”".equals(resultXML)){
  44.                         out.print(resultXML);
  45.                         out.flush();
  46.                         out.close();
  47.                     }
  48.                 }
  49.                 socket.close();
  50.                 System.out.println(“socket stop…..”);
  51.             }catch(IOException ex){
  52.             }finally{
  53.             }
  54.      }
  55. }