`

关于socket长连接的心跳包

阅读更多
转自:http://blog.csdn.net/klarclm/article/details/7784265

出于最近对im研究的兴趣,看到smack里有个30s发送一个空消息的线程,了解了下关于心跳包,keepalive的知识。 TCP的socket本身就是长连接的,那么为什么还要心跳包呢?
搜索到的资料解释如下:
一:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。
二:理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

三:
如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确定连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
这取决于你的server端的超时配置, 每个socket连接都是长连接,它是一个相当占用系统资源的通信管道, 如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。
所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)。


记得以前开发手机游戏时,索爱有一款手机有强制要求,客户端如果超过三分钟无消息发向网络服务端,则会在客户端自动地强制把socket关断。因为socket长连接相对于手机这样资源少的设备来说是宝贵的资源。  (这个强制是指客户端系统自动关的,不是我们代码close的)





这3个原因都是挺有道理。如果你有更好的解释欢迎交流啊。改天我做个程序测试一下不发心跳包和发心跳包的连接情况。


来源:1.http://blog.csdn.net/qgjava/article/details/5745776


2.http://topic.csdn.net/u/20081009/13/abd12947-e78e-43ba-9a43-ce690ecb8ac2.html



3.http://zhidao.baidu.com/question/349886234.html


以下是Smack里发送心跳包的代码:
PacketWrite.java
void startKeepAliveProcess()
  {
    int keepAliveInterval = SmackConfiguration.getKeepAliveInterval();
    if (keepAliveInterval > 0) {
      KeepAliveTask task = new KeepAliveTask(keepAliveInterval);
      this.keepAliveThread = new Thread(task);
      task.setThread(this.keepAliveThread);
      this.keepAliveThread.setDaemon(true);
      this.keepAliveThread.setName("Smack Keep Alive (" + this.connection.connectionCounterValue + ")");
      this.keepAliveThread.start();
    }
  }

private class KeepAliveTask
    implements Runnable
  {
    private int delay;
    private Thread thread;

    public KeepAliveTask(int paramInt)
    {
      this.delay = paramInt;
    }

    protected void setThread(Thread thread) {
      this.thread = thread;
    }

    public void run()
    {
      try
      {
        Thread.sleep(15000L);
      }
      catch (InterruptedException localInterruptedException)
      {
      }
      while ((!(PacketWriter.this.done)) && (PacketWriter.this.keepAliveThread == this.thread)) {
        synchronized (PacketWriter.this.writer)
        {
          if (System.currentTimeMillis() - PacketWriter.this.lastActive >= this.delay) {
            try {
              PacketWriter.this.writer.write(" ");
              PacketWriter.this.writer.flush();
            }
            catch (Exception localException)
            {
            }
          }
        }
        try
        {
          Thread.sleep(this.delay);
        }
        catch (InterruptedException localInterruptedException1)
        {
        }
      }
    }
  }

分享到:
评论
1 楼 dd18349182956 2016-09-19  
你是用的smack哪个版本?我用的smack4.1.3和smack4.1.8都没有这种处理,只有重连处理以及ping处理,但是不在PacketWrite类里面

相关推荐

    Socket长连接+心跳包+发送读取

    以下是Socket长连接、心跳包和数据发送读取的关键知识点: 1. **TCP连接**:Socket基于传输层的TCP协议,提供可靠的双向通信。TCP保证了数据的顺序和完整性,通过三次握手建立连接,四次挥手断开连接。 2. **...

    Android-Socket长连接通信心跳包消息回调Java服务端

    通过分析和学习这个项目,你可以更直观地了解上述知识点的实现方式,包括如何创建Socket连接、实现心跳包、处理消息回调以及服务端的多线程处理等。 总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端...

    socket 长连接 多线程 心跳包 包头包体

    socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...

    Android的socket长连接(心跳检测)

    - 这个文件可能是一个服务(Service),负责接收和处理来自客户端的Socket连接和心跳包。 - 服务启动后,监听指定端口,当有新的Socket连接请求时,创建线程处理客户端的输入输出流,同时处理心跳检测。 6. **...

    Socket长连接心跳

    以上就是关于Socket长连接心跳的主要内容。通过合理设计和实现心跳机制,可以显著提升网络连接的稳定性和用户体验。在实际项目中,还需要根据具体业务需求进行优化和调整。提供的`SocketSe`和`SocKetCli`可能分别是...

    Java实现Socket长连接和短连接

    Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short Connection)** 短连接通常用于一次性、非持久性的通信,如HTTP协议就是典型的短连接。在短连接中...

    socketTCP通信心跳包实例

    心跳包在TCP通信中起到了关键作用,它能检测到网络连接的中断并及时通知应用程序,避免因长时间无数据传输导致的假死连接。 在Winform应用中实现socket心跳包,通常包括以下几个步骤: 1. 创建Socket对象:在C#中...

    TCP长连接Socket心跳收发消息

    心跳包的设计可以防止网络延迟或丢包导致的假死连接,同时也可用来检测并及时处理异常情况。 实现TCP长连接Socket心跳收发消息的过程通常包括以下步骤: 1. 建立TCP连接:客户端发起连接请求,服务器响应,完成三...

    winform socket通讯和心跳包

    心跳包是维持网络连接稳定性的关键技术,尤其在长连接中,例如TCP连接。心跳包定期发送,以确认连接仍然活跃并检测可能的网络问题。 6. **实现心跳包机制**:在Winform Socket通信中,心跳包通常由服务器或客户端...

    netty基于http socket websocke及心跳包机制t的demo

    心跳包机制在网络通信中扮演着重要角色,特别是在长时间无数据交换或需要检测连接状态的场景下。在Netty中,心跳包可以是自定义的协议消息,服务器和客户端定期交换这些消息以确认连接的活跃性。如果在预设时间内...

    c# Socket长连接 短链接 自己封装 通讯

    标题“c# Socket长连接 短链接 自己封装 通讯”揭示了我们将讨论的主题:如何使用C#实现Socket的长连接和短连接,并自定义通信协议。这里的关键点包括: 1. **Socket基础**:Socket是网络通信中的一个抽象概念,它...

    Socket长连接demo

    本示例可能是一个关于如何实现和管理Socket长连接的代码演示。 在TCP/IP协议族中,Socket分为两种类型:短连接(Short-lived Connection)和长连接(Long-lived Connection)。短连接通常用于一次性传输数据,如...

    Socket心跳连接_java

    1. **建立Socket连接**:客户端使用`Socket`类的构造函数,指定服务器的IP地址和端口号,建立到服务器的连接。 2. **心跳包设计**:定义心跳包的格式,例如可以是一个简单的JSON对象,包含时间戳和"ping"或"pong"的...

    C# socket异步长连接

    在C#中,System.Net.Sockets命名空间提供了Socket类,用于创建和管理socket连接。 在“异步”方面,C#的Socket支持异步操作模式,这意味着你可以启动一个网络操作(如连接、接收或发送数据),然后继续执行其他任务...

    java socket 长连接实例

    "Java Socket 长连接实例"是关于如何实现一个持久连接的服务器和客户端程序的示例,这种连接能够保持开放,直到一方明确地关闭它。这在需要频繁通信或者需要长时间保持连接状态的应用场景中非常有用,比如聊天应用、...

    C#之实现Scoket心跳机制

    C#高级编程之实现Socket心跳机制,TCP网络长连接。 心跳包之所以叫心跳包是因为:...总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

    Java心跳包功能实现

    - 使用`Socket`类连接到服务器端,获取`OutputStream`用于发送心跳包,`InputStream`用于接收心跳包。 - 同样,客户端也需要开启一个线程持续发送心跳包,并且在主线程中接收服务端的心跳包。 - 客户端心跳包发送...

    socket心跳功能

    1. 创建Socket连接:使用`Socket`类创建到服务器的连接,通常还会伴随着`ServerSocket`类在服务端接收连接。 2. 设计心跳包:心跳包可以是自定义的字符串或特定结构的数据,如JSON格式的简单对象,包含心跳类型、...

    TCP通信心跳包源码C语言实现

    在TCP(传输控制协议)中,心跳包是一种保持连接活性的机制,主要用于检测网络连接是否仍然有效,防止因网络静默导致的连接超时或断开。本篇将详细讲解如何使用C语言在Linux平台上实现TCP心跳包的功能,并探讨其核心...

    android客户端加服务端的socket长连接

    4. 长连接需要保持Socket连接状态,通常会设置心跳机制,定期发送心跳包以检查连接是否正常。 三、客户端对服务器发送消息 1. 客户端通过Socket的OutputStream将要发送的消息编码成字节流,然后写入到输出流。 2. ...

Global site tag (gtag.js) - Google Analytics