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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。