Java如何实现长连接
实现原理:
长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。
如果,长时间未发送维持连接包,服务端程序将断开连接。
客户端:
Client通过持有Socket的对象,可以随时(使用sendObject方法)发送MassageObject(消息)给服务端。
如果keepAliveDelay毫秒(程序中是2秒)内未发送任何数据,则自动发送一个KeepAliveObject(心跳)给服务端,用于维持连接。
由于,我们向服务端,可以发送很多不同的消息对象,服务端也可以返回不同的对象。所以,对于返回对象的处理,要编写具体的ObjectAction实现类进行处理。通过Client.addActionMap方法进行添加。这样,程序会回调处理。
服务端:
由于客户端会定时(keepAliveDelay毫秒)发送维持连接的信息过来,所以,服务端要有一个检测机制。
即当服务端receiveTimeDelay毫秒(程序中是3秒)内未接收任何数据,则自动断开与客户端的连接。
ActionMapping的原理与客户端相似(相同)。
通过添加相应的ObjectAction实现类,可以实现不同对象的响应、应答过程。
心跳反映的代码:
packagecom.java.excel.keepalive;
importjava.io.Serializable;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*
*维持连接的消息对象(心跳对象)
*/
publicclassKeepAliveimplementsSerializable{
privatestaticfinallongserialVersionUID=-2813120366138988480L;
/*覆盖该方法,仅用于测试使用。
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
returnnewSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(newDate())+"\t维持连接包";
}
}
服务端
packagecom.java.excel.keepalive;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.concurrent.ConcurrentHashMap;
publicclassServer{
/**
*要处理客户端发来的对象,并返回一个对象,可实现该接口。
*/
publicinterfaceObjectAction{
ObjectdoAction(Objectrev,Serverserver);
}
publicstaticfinalclassDefaultObjectActionimplementsObjectAction{
publicObjectdoAction(Objectrev,Serverserver){
System.out.println("处理并返回:"+rev);
returnrev;
}
}
publicstaticvoidmain(String[]args){
intport=65432;
Serverserver=newServer(port);
server.start();
}
privateintport;
privatevolatilebooleanrunning=false;
privatelongreceiveTimeDelay=3000;
privateConcurrentHashMapactionMapping=newConcurrentHashMap();
privateThreadconnWatchDog;
publicServer(intport){
this.port=port;
}
publicvoidstart(){
if(running)return;
running=true;
connWatchDog=newThread(newConnWatchDog());
connWatchDog.start();
}
@SuppressWarnings("deprecation")
publicvoidstop(){
if(running)running=false;
if(connWatchDog!=null)connWatchDog.stop();
}
publicvoidaddActionMap(Class
客户端
packagecom.java.excel.keepalive;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.util.concurrent.ConcurrentHashMap;
publicclassClient{
/**
*处理服务端发回的对象,可实现该接口。
*/
publicstaticinterfaceObjectAction{
voiddoAction(Objectobj,Clientclient);
}
publicstaticfinalclassDefaultObjectActionimplementsObjectAction{
publicvoiddoAction(Objectobj,Clientclient){
System.out.println("处理:\t"+obj.toString());
}
}
publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{
StringserverIp="127.0.0.1";
intport=65432;
Clientclient=newClient(serverIp,port);
client.start();
}
privateStringserverIp;
privateintport;
privateSocketsocket;
privatebooleanrunning=false;//连接状态
privatelonglastSendTime;//最后一次发送数据的时间
//用于保存接收消息对象类型及该类型消息处理的对象
privateConcurrentHashMapactionMapping=newConcurrentHashMap();
publicClient(StringserverIp,intport){
this.serverIp=serverIp;
this.port=port;
}
publicvoidstart()throwsUnknownHostException,IOException{
if(running)return;
socket=newSocket(serverIp,port);
System.out.println("本地端口:"+socket.getLocalPort());
lastSendTime=System.currentTimeMillis();
running=true;
newThread(newKeepAliveWatchDog()).start();//保持长连接的线程,每隔2秒项服务器发一个一个保持连接的心跳消息
newThread(newReceiveWatchDog()).start();//接受消息的线程,处理消息
}
publicvoidstop(){
if(running)running=false;
}
/**
*添加接收对象的处理对象。
*@paramcls待处理的对象,其所属的类。
*@paramaction处理过程对象。
*/
publicvoidaddActionMap(Class
以上就是Java如何实现长连接的详细内容,更多关于java实现长连接的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。