java心跳包检测.docx
- 文档编号:3116865
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:11
- 大小:17.09KB
java心跳包检测.docx
《java心跳包检测.docx》由会员分享,可在线阅读,更多相关《java心跳包检测.docx(11页珍藏版)》请在冰豆网上搜索。
java心跳包检测
java心跳包检测
JavaSocketM
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
import.InetSocketAddress;
import.ServerSocket;
import.Socket;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.DocumentHelper;
importcn.edu.zju.cst.mina.im.server.entity.User;
importcn.edu.zju.cst.mina.im.server.handler.ServerControler;
publicclassUserStateManageextendsThread{
//在线用户状态列表
staticHashMap
ObjecthashLock=newObject();
//当前的连接数和工作线程数
staticintworkThreadNum=0;
staticintsocketConnect=0;
privateServerSocketserverSocket;
//服务器IP
privateStringhost="10.82.81.79";
//服务器端口
privateintstateReportPort=60001;
//设置心跳包的结束标记
StringendFlag="";
CharSequencecsEndFlag=endFlag.subSequence(0,10);
//扫描间隔
privateintscanTime=1800;
@Override
publicvoidrun(){
//绑定端口,并开始侦听用户的心跳包
serverSocket=startListenUserReport(stateReportPort);
if(serverSocket==null){
System.out.println("【创建ServerSocket失败!
】");
return;
}
//启动扫描线程
ThreadscanThread=newThread(newscan());
scanThread.start();
//等待用户心跳包请求
while(true){
Socketsocket=null;
try{
socketConnect=socketConnect+1;
//接收客户端的连接
socket=serverSocket.accept();
//为该连接创建一个工作线程
ThreadworkThread=newThread(newHandler(socket));
//启动工作线程
workThread.start();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*创建一个ServerSocket来侦听用户心跳包请求
*@paramport指定的服务器端的端口
*@return返回ServerSocket
*@authordream
*/
publicServerSocketstartListenUserReport(intport){
try{
ServerSocketserverSocket=newServerSocket();
if(!
serverSocket.getReuseAddress()){
serverSocket.setReuseAddress(true);
}
serverSocket.bind(newInetSocketAddress(host,port));
System.out.println("【开始在"+serverSocket.getLocalSocketAddress()+"上侦听用户的心跳包请求!
】");
returnserverSocket;
}catch(IOExceptione){
System.out.println("【端口"+port+"已经被占用!
】");
if(serverSocket!
=null){
if(!
serverSocket.isClosed()){
try{
serverSocket.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
returnserverSocket;
}
//工作线程类
classHandlerimplementsRunnable{
privateSocketsocket;
UserStateus=null;
UsernewUser=null;
privateintuserId;
privateintuserState;
/**
*构造函数,从调用者那里取得socket
*@paramsocket指定的socket
*@authordream
*/
publicHandler(Socketsocket){
this.socket=socket;
}
/**
*从指定的socket中得到输入流
*@paramsocket指定的socket
*@return返回BufferedReader
*@authordream
*/
privateBufferedReadergetReader(Socketsocket){
InputStreamis=null;
BufferedReaderbr=null;
try{
is=socket.getInputStream();
br=newBufferedReader(newInputStreamReader(is));
}catch(IOExceptione){
e.printStackTrace();
}
returnbr;
}
publicvoidrun(){
try{
workThreadNum=workThreadNum+1;
System.out.println("【第"+workThreadNum+"个的连接:
"+socket.getInetAddress()+":
"+socket.getPort()+"】");
BufferedReaderbr=getReader(socket);
Stringmeg=null;
StringBufferreport=newStringBuffer();
while((meg=br.readLine())!
=null){
report.append(meg);
if(meg.contains(csEndFlag)){
us=getReporterUserState(meg,socket);
synchronized(hashLock){
userStateList.put(userId,us);
}
}
}
}catch(IOExceptione){
System.out.println("【客户:
"+newUser.getUser_id()+"已经断开连接!
】");
userStateList.remove(userId);
announceStateChange(userId,-1);
}finally{
if(socket!
=null){
try{
//断开连接
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
privateUserStategetReporterUserState(Stringmeg,Socketsocket){
UserStateus=newUserState();
try{
DocumentrequestDoc=DocumentHelper.parseText(meg);
newUser=ServerControler.parseXmlToUserState(requestDoc,socket);
userId=newUser.getUser_id();
userState=newUser.getUser_state();
us.setFlag
(2);
us.setUser_state(userState);
us.setUser_id(userId);
us.setUser_ip(newUser.getUser_ip());
us.setUser_port(newUser.getUser_port());
}catch(DocumentExceptione){
System.out.println("【来自客户端的信息不是一个合法的心跳包协议】");
}
returnus;
}
}
//扫描线程
classscanimplementsRunnable{
publicvoidrun(){
while(true){
System.out.println("*******"+newDate()+":
扫描线程开始扫描"+"*******");
synchronized(hashLock){
if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 心跳 检测