javaweb启动时启动socket服务端代码实现
这篇文章主要介绍了javaweb启动时启动socket服务端代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
说明:在javaweb项目启动的时候启动socket服务端,可以接受客户端发送过来的数据,客户端可以反复断开连接
1.新建SocketThread线程类
packagecom.wlw.modules.startImplement.web; importjava.io.IOException; importjava.net.ServerSocket; importjava.net.Socket; /** *socket线程类 *@Author:zhouhe *@Date:2019/4/1614:58 */ publicclassSocketThreadextendsThread{ privateServerSocketserverSocket=null; publicSocketThread(ServerSocketserverScoket){ try{ if(null==serverSocket){ this.serverSocket=newServerSocket(8877); System.out.println("socketstart"); } }catch(Exceptione){ System.out.println("SocketThread创建socket服务出错"); e.printStackTrace(); } } publicvoidrun(){ while(!this.isInterrupted()){ try{ Socketsocket=serverSocket.accept(); if(null!=socket&&!socket.isClosed()){ //处理接受的数据 newSocketOperate(socket).start(); } //socket.setSoTimeout(30000);//设置超时 }catch(Exceptione){ } } } publicvoidcloseSocketServer(){ try{ if(null!=serverSocket&&!serverSocket.isClosed()) { serverSocket.close(); } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }
2.新建SocketOperate,用于接受客户端传来的数据
packagecom.wlw.modules.startImplement.web; importcom.wlw.modules.lhjh.socket.tstandard.MessageParsing; importjava.io.BufferedInputStream; importjava.io.DataInputStream; importjava.io.IOException; importjava.net.Socket; /** *多线程处理socket接收的数据 *@Author:zhouhe *@Date:2019/4/1614:59 */ publicclassSocketOperateextendsThread{ privateSocketsocket; publicSocketOperate(Socketsocket){ this.socket=socket; } @Override publicvoidrun(){ try{ //封装输入流(接收客户端的流) BufferedInputStreambis=newBufferedInputStream(socket.getInputStream()); DataInputStreamdis=newDataInputStream(bis); byte[]bytes=newbyte[1];//一次读取一个byte Stringret=""; while(dis.read(bytes)!=-1){ ret+=MessageParsing.bytesToHexString(bytes)+""; if(dis.available()==0){//一个请求 System.out.println("转换为字符串后:"+MessageParsing.hexStringToString(ret)); System.out.println("转为map后的数据:"+MessageParsing.stringToMap(MessageParsing.hexStringToString(ret))); ret=""; } } }catch(Exceptione){ e.printStackTrace(); }finally{ System.out.println("clientisover"); if(socket!=null){ try{ socket.close(); }catch(IOExceptione){ e.printStackTrace(); } } } } }
3.新建InitJob,web项目启动的时候会执行里面的方法,去启动socket,可以用串口调试工具测试
packagecom.wlw.modules.startImplement.web; importcom.wlw.common.config.Global; importjavax.servlet.ServletContextEvent; importjavax.servlet.ServletContextListener; /** *@Author:zhouhe *@Date:2019/4/1611:00 */ //创建的类名根据需要定义,但一定要实现ServletContextListener接口 publicclassInitJobimplementsServletContextListener{ //socketserver线程 privateSocketThreadsocketThread; /** *项目在启动初始化的时候就会执行的方法(启动服务时执行) *@paramarg0 */ @Override publicvoidcontextInitialized(ServletContextEventarg0){ //TODOAuto-generatedmethodstub //这里可以放你要执行的代码或方法 if(null==socketThread&&"yes".equals(Global.getConfig("socket"))){ //MessageParsing.calculation(); //新建线程类 socketThread=newSocketThread(null); //启动线程 socketThread.start(); } } /** *contextDestroyed是在消亡的时候执行的方法(关闭服务时执行) *@paramarg0 */ @Override publicvoidcontextDestroyed(ServletContextEventarg0){ //TODOAuto-generatedmethodstub if(null!=socketThread&&!socketThread.isInterrupted()){ socketThread.closeSocketServer(); socketThread.interrupt(); } } }
4.这里需要一个报文解析工具类
packagecom.wlw.modules.lhjh.socket.tstandard; importjava.util.HashMap; importjava.util.Map; /** *HJ/T212报文解析 *@Author:zhouhe *@Date:2019/4/1210:11 */ publicclassMessageParsing{ /** *字符串转换为map *@paramarr *@return */ publicstaticMapstringToMap(Stringarr){ arr=arr.replaceAll(",",";"); Mapmap=newHashMap(); if(null!=arr){ String[]param=arr.split(";"); for(inti=0;i-1才是map格式 intindex=param[i].indexOf('='); if(index>-1) map.put(param[i].substring(0,index),param[i].substring((index+1))); } } returnmap; } /** *byte[]数组转换为16进制的字符串 * *@parambytes要转换的字节数组 *@return转换后的结果 */ publicstaticStringbytesToHexString(byte[]bytes){ StringBuildersb=newStringBuilder(); for(inti=0;i 这样就大功告成了,启动web项目,就可以接受客户端过来的数据了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。