概述
很多人会使用sokcet.sendUrgentData 但是这个有弊端,需要实时访问传输,
https://gitee.com/SnailcatMall/serverRecvSendas
我在这里分享一下关于客户端与服务的的双向监听心跳写法.
方便后期使用
个人学习记录:
package org.example.tools;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Map;
/**
* @see clientDataRead 客户端数据读取
*/
public class clientDataRead implements Runnable,clientSendRead {
@Override
public void run() {
/**
* 让作为线程安全去执行
* */
synchronized (clientDataRead.class){
while (true){
try {
/**
* Thread.sleep(1000);
* 我希望间隔一秒进行数据读取不需要实时数据读写
* */
Thread.sleep(1000);
/**
* if(Utils.stringSocketMap.size()>0)
* 建议集合大于0的情况下去执行,如果小于也不会报错
* */
if(Utils.stringSocketMap.size()>0){
/**
* 遍历Map集合的客户端开始进行数据读写
* 我考虑在这里添加一个心跳功能检测客户端是否断开连接
* */
for (Map.Entry<InetAddress, Socket> entry : Utils.stringSocketMap.entrySet()) {
try {
/**
* 客户端心跳检测,断开关闭客户端数据
* */
this.SocketData(entry.getValue().getOutputStream(),entry.getValue().getInputStream(),entry.getValue());
}catch (IOException ioException){
System.out.println("IO异常");
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
/**
* @param outputStream 写
* @param inputStream 读
* @param socket 客户端标识符
*/
@Override
public void SocketData(OutputStream outputStream, InputStream inputStream, Socket socket) {
try {
/**
* outputStream.write(0);
* 服务端发送 byte 0 也可以实现心跳检测 如果断开则通过try去关闭socket
* 客户端也可以采用这个方法判断服务器是否断开连接
* */
outputStream.write(0);
} catch (IOException ioException) {
/**
* 移除Map集合的socket标识符
* */
Utils.stringSocketMap.remove(socket.getInetAddress());
/**
* 显示在线人数
* */
System.out.println("当前在线用户数:" + Utils.stringSocketMap.size() + "位");
/**
* 我最终还是选择在删掉Map集合中的值顺带关闭客户端标识节省资源
* */
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最后
以上就是自由大叔为你收集整理的关于java Socket 检测服务器或者客户端是否断开连接心跳写法解决方案的全部内容,希望文章能够帮你解决关于java Socket 检测服务器或者客户端是否断开连接心跳写法解决方案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复