java web项目中使用Socket通信多线程、长连接

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听。我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应。

先看一下web的监听代码:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
public class AttendSocetListener  implements ServletContextListener{
    private SocketThread socketThread;
    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)  
        {  
         //新建线程类  
         socketThread=new SocketThread(null);  
         //启动线程  
         socketThread.start();  
        }  
    }  
   
 
}

创建线程:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
 
 
public class SocketThread extends Thread
{
       private ServerSocket serverSocket = null;  
           
        public SocketThread(ServerSocket serverScoket){  
            try {  
                if(null == serverSocket){  
                    this.serverSocket = new ServerSocket(8877);  
                    System.out.println("socket start");  
                }  
            } catch (Exception e) {  
                System.out.println("SocketThread创建socket服务出错");  
                e.printStackTrace();  
            }  
       
        }  
           
        public void run(){  
            while(true){  
                try {  
                    if(serverSocket==null){
                        break;
                    }else if(serverSocket.isClosed()){
                        break;
                    }
                    Socket socket = serverSocket.accept();  
                    if(null != socket && !socket.isClosed()){     
                        //处理接受的数据  
                        Thread t1 = new Thread(new SocketOperate(socket));  
                        t1.start();  
                    }else{
                        break;
                    }
                }catch (Exception e) {  
                    System.out.println("SocketThread创建socket服务出错111111111111111111111111");  
                    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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
 
public class SocketOperate implements Runnable {  
     private Socket socket;  
     //该线程所处理的Socket所对应的输入流  
     BufferedReader br = null;  
     String str = null;  
     String content = null;  
     InputStreamReader reader=null;  
     public SocketOperate(Socket socket) throws IOException  
     {  
         this.socket = socket;  
         reader = new InputStreamReader(this.socket.getInputStream(),"utf-8");  
         br = new BufferedReader(reader);  
     }  
    
     @Override  
     public void run()  
     {  
         try  
         {  
             // 采用循环不断从Socket中读取客户端发送过来的数据  
            while (true)  
             {  
               content = readFromClient();  
               System.out.println(content);
            if (content == null)  
             {  
              break;  
             }  
             OutputStream os = socket.getOutputStream();  
             os.write(("RES, OK,<1年2班,小明>, 123241,#" + "\n").getBytes("utf-8"));  
             os.flush();
             }  
         }  
         catch (IOException e)  
         {  
          e.printStackTrace();  
         }  
     }  
     //定义读取客户端数据的方法  
     private String readFromClient()  
     {  
         try  
         {  
          str = br.readLine();  
          return str;  
            
         }  
         //如果捕捉到异常,表明该Socket对应的客户端已经关闭  
         catch (IOException e)  
         {  
         try {
             br.close();
         reader.close();
            socket.close();
         } catch (IOException e1) {
             // TODO Auto-generated catch block
             e1.printStackTrace();
            } 
         }  
         return null;  
     }  
 }

客户端代码:
package
import java.io.*;
import java.net.*;
 
public class TalkClient {
 
    public static void main(String args[]) throws UnknownHostException, IOException {
         Socket socket=new Socket("192.168.3.104",8877);
         PrintWriter os=new PrintWriter(socket.getOutputStream());
         BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         int i=1;
         while(socket.isConnected()){
         os.print("BEAT,12345678,160314,092832,1.00,123241,#"+"\n");
         os.flush();
         System.out.println("Client:"+i);
         System.out.println("Server:"+is.readLine());
         i++;
         } 
         //继续循环
         os.close(); //关闭Socket输出流
         is.close(); //关闭Socket输入流
         socket.close(); //关闭Socket
             
            }
}

转载于:https://my.oschina.net/zhangmaoyuan/blog/1606290

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值