博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java web项目中使用Socket通信多线程、长连接
阅读量:6186 次
发布时间:2019-06-21

本文共 5404 字,大约阅读时间需要 18 分钟。

hot3.png

很多时候在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;       }   }
客户端代码:
packageimport 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

你可能感兴趣的文章
Retrofit源码解读(二)--Retrofit中网络通信相关
查看>>
1.2逻辑结构和物理结构
查看>>
【Android】APT(编译时生成代码)
查看>>
直播多人连麦技术简介
查看>>
《自动化办公》两秒完成250页豆瓣电影PPT
查看>>
作为前端,你不得不知道的搜索引擎优化
查看>>
编译deno,deno结构解析
查看>>
推动快递保价大众化,顺丰、京东、通达系谁更彻底?
查看>>
Qtum量子链研究院:Qtum Plasma MVP 技术详解
查看>>
VR全景图片浏览实现
查看>>
Vue 中组件使用中的细节点
查看>>
【译】 WebSocket 协议第九章——扩展(Extension)
查看>>
深入call apply bind
查看>>
22. Generate Parentheses
查看>>
函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难
查看>>
如何让自己看起来更专业?前端程序员必须了解的几个“词语”
查看>>
网页水印SDK的实现
查看>>
Spring - Configuration Metadata
查看>>
ES学习笔记(1)--环境搭建
查看>>
关于《算法》第一章的一点总结
查看>>