java socket——心跳包

2023-11-17

首先先说说心跳包在socket连接中的意义:
通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符,这个字符可以根据双方自定义,没有实际的通讯意义。
而定制的时间也是双方协商后定制的。

首先设置socket的一些属性:

//表示底层的TCP 实现会监视该连接是否有效。默认值为 false, 表示TCP 不会监视连接是否有效, 不活动的客户端可能会永远存在下去, 而不会注意到服务器已经崩溃。(当连接处于空闲状态(连接的两端没有互相传送数据) 超过了 2 小时时, 本地的TCP 实现会发送一个数据包给远程的 Socket. 如果远程Socket 没有发回响应, TCP实现就会持续尝试 11 分钟, 直到接收到响应为止. 如果在 12 分钟内未收到响应, TCP 实现就会自动关闭本地Socket, 断开连接. 在不同的网络平台上, TCP实现尝试与远程Socket 对话的时限有所差别.)
  if(!socket.getKeepAlive()) socket.setKeepAlive(true);   
//默认值为 false。为 true 时, 表示支持发送一个字节的 TCP 紧急数据. Socket 类的 sendUrgentData(int data) 方法用于发送一个字节的 TCP紧急数据。 为 false的这种情况下, 当接收方收到紧急数据时不作任何处理, 直接将其丢弃. 如果用户希望发送紧急数据, 应该把 OOBINLINE 设为 trueif(!socket.getOOBInline())socket.setOOBInline(true);

心跳包的写法:

    private Thread thread;//循环发送心跳包的线程
    private Socket socket;//与服务器建立连接的socket对象
    private OutputStream outputStream;//输出流,用于发送心跳

    public void startThreadSocket() {
        try {
            if(!socket.getKeepAlive()) socket.setKeepAlive(true);//true,若长时间没有连接则断开
            if(!socket.getOOBInline())socket.setOOBInline(true);//true,允许发送紧急数据,不做处理
            outputStream = socket.getOutputStream();//获得socket的输出流
            final String socketContent = "[这里为与服务器协商的特殊字符串,用于识别是发送的心跳信息]" + "\n";
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(20 * 1000);//20s发送一次心跳
                            outputStream.write(socketContent.getBytes("UTF-8"));
                            outputStream.flush();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            thread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

心跳包的写法很简单,和服务器商定特殊字符串,接收后不做处理。定时发送,然后设置一下socket的属性就行了。

关于socket的其他属性设置:

TCP_NODELAY: 表示立即发送数据.

SO_RESUSEADDR: 表示是否允许重用Socket 所绑定的本地地址.

SO_TIMEOUT: 表示接收数据时的等待超时数据.

SO_LINGER: 表示当执行Socket 的 close()方法时, 是否立即关闭底层的Socket.

SO_SNFBUF: 表示发送数据的缓冲区的大小.

SO_RCVBUF: 表示接收数据的缓冲区的大小. SO_KEEPALIVE: 表示对于长时间处于空闲状态的Socket , 是否要自动把它关闭. OOBINLINE: 表示是否支持发送一个字节的TCP 紧急数据.
if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);//关闭缓冲区,及时发送数据;默认false,打开缓冲区;先放在缓冲区, 等缓存区满了再发出. 发送完一批数据后, 会等待接收方对这批数据的回应, 然后再发送下一批数据
if(!socket.getResuseAddress())socket.setResuseAddress(true);

//当接收方通过Socket 的close() 方法关闭Socket 时, 如果网络上还有发送到这个Socket 的数据, 那么底层的Socket 不会立即释放本地端口,而是会等待一段时间,确保接收到了网络上发送过来的延迟数据, 然后再释放端口。Socket接收到延迟数据后,不会对这些数据作任何处理。socket接收延迟数据的目的是,确保这些数据不会被其他碰巧绑定到同样端口的新进程接收到。

方法必须在Socket还没有绑定到一个本地端口之前调用,否则执行socket.setResuseAddress(true) 方法无效. 因此必须按照以下方式创建Socket对象, 然后再连接远程服务器 。

更多的属性解释就不一一列举了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java socket——心跳包 的相关文章

随机推荐

  • nginx根据url参数动态代理

    nginx根据url参数动态代理 请求url格式 其中参数proxy后面的url就是需要访问的真实地址 http localhost 9388 proxy http localhost 8038 Content layui font ico
  • 腾讯滑块识别-通用滑块识别

    遇到滑块问题 在写爬虫的时候 经常会遇到滑块问题 很多次都想过尝试如何攻破滑块 但是每次都没成功 除了最开始的极验滑块 当时通过原图和滑块图的对比 能够得出缺口坐标 但是随着极验 网易 腾讯滑块的更新 已经不能够找到原图了 下面给出滑块通杀
  • python的gui神器——gooey

    python的gui神器 gooey python自带的gui库 tkinter库 最近研究的gui库 gooey tkinter教程 tkinter GUI编程 gooey地址和教程 gooey 入门教程 python使用tkinter库
  • Android基础知识 - 内置SQLite数据库

    文章目录 SQLite数据库简单介绍 创建数据库 SQLiteOpenHelper类 简单概述 DatabaseTest项目 升级数据库 对表中的数据进行操作 添加数据 更新数据 删除数据 查询数据 使用SQL操作数据库 SQLite数据库
  • 03 xxl-job任务执行流程

    作业类型 xxl job支持七种作业类型 Bean GLUE Java GLUE Shell GLUE Python GLUE PHP GLUE Nodejs GLUE PowerShell 其中 GLUE类型作业都是在admin管理端编辑
  • Unity3d Survival Shooter Tutorial 学习笔记(八)---游戏结束

    1 在HUDCanvas下新建Image ScreenFader 设置为全屏显示 且颜色设置为浅蓝 2 添加GameOverText 并设置Text参数 3 调整HUDCanvas顺序 与就是渲染顺序 4 初始化时 把GameOverTex
  • 用Eigen库练习代数运算方式以便后续对刚体旋转和移动做基础

    include
  • qt背景渐变色的效果

    background color qlineargradient spread pad x1 0 y1 0 x2 0 y2 1 stop 0 87CEFA stop 1 292F38 背景颜色 画线部分可以达到渐变的效果图
  • CentOS 下安装 Docker

    要求 要安装 Docker 我们需要 CentOS 7 及以上的发行版本 建议使用overlay2存储驱动程序 卸载已有 Docker 如果你已经安装过旧版的 Docker 可以先执行以下命令卸载旧版 Docker sudo yum rem
  • sqli-labs解题大法29 ~40

    Less 29 堆叠查询 在一条语句之后加上分号 然后接下一条语句 可以一次执行多条语句 order by 排序 可以 联合查询 可以 参考Less 1 Background 6 服务器 两层 架构 http www cnblogs com
  • Linux笔记

    Linux 基础笔记 Linux文件目录 目录 描述 Linux系统根目录 bin usr bin 可执行二进制文件的目录 如常用的命令ls tar mv cat等 boot 存放Linux系统启动时用到的一些文件 如Linux内核文件 b
  • OR EXISTS语句的优化方法

    OR EXISTS语句的优化方法 这库一直很空闲 但无意中看了一下 发现其中很多语句都很有问题 都是典型的OR问题语句 如果并发量大的话 CPU一下子就飙高了 OR语句一直是性能杀手 当存在一两个的时候一般可以用union和union al
  • nodejs打造cli工具

    nodejs打造cli工具 前言 项目先体验 可执行的node程序 项目实践 项目初始化 总结 前言 使用nodejs打造cli工具 本文意指通过实现一个简单的cli工具来了解nodejs可执行程序 而不是工程化具体的实现 本文适合node
  • 网络传输数据基本流程 详解

    我是目录 1 网络传输流程图 2 数据包的封装分用 3 不同网络环境中 网络数据传输流程 1 网络互联 2 局域网 3 广域网 1 网络传输流程图 2 两台计算机通过 TCP IP 协议通讯的过程如下所示 2 数据包的封装分用 3 不同网络
  • 【多目标优化算法】多目标蚱蜢优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及详细文章讲解 1 概述 摘要本文从自然界中草蜢群的导航出
  • 如何用API下载从哥白尼气候数据中心ECWMF下载数据

    在此以ERA5的hourly数据 1 为例 ECWMF数据中心的界面用户友好度很高 在你选择相应的变量后会生API代码 复制到python编译器例如jupyter即可下载 以下为详细步骤 1 先注册成为用户 然后在网页上登陆 即可等到账户对
  • Apache相关的几个安全漏洞修复

    最近网站被扫描出几个漏洞 大部分都是apache配置引起的 在此记录一下怎么修复 1 检测到目标URL存在http host头攻击漏洞 头攻击漏洞 比较常见的漏洞 修复的方法也提供了 漏洞的详细描述 为了方便的获得网站域名 开发人员一般依赖
  • 轻松调试线上的app之抓包工具stream

    痛点 对于一个线上app 是不是会因为无法调试而痛苦不堪 今天就给大家介绍一款好用的ios抓包应用 安装 1 在appstore中搜索stream 直接下载 2 打开软件 设置https抓包 对于https我们需要安装一下证书 具体原因可以
  • Android基础面试常常死在这几个问题上,移动架构师成长路线

    近日一好友去阿里面试 面试失败了 分享了一个他最不擅长的算法面试题 题目是这样的 题目 给定一个二叉搜索树 BST 找到树中第 K 小的节点 出题人 阿里巴巴出题专家 文景 阿里云 CDN 资深技术专家 参考答案 考察点 基础数据结构的理解
  • java socket——心跳包

    首先先说说心跳包在socket连接中的意义 通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符 这个字符可以根据双方自定义 没有实际的通讯意义 而定制的