zoukankan      html  css  js  c++  java
  • 关于websocket中的心跳..

    客户端的实现:
    1, 如果你正在对流进行读写,那么表示其实你己经在活跃状态,不需要发送心跳消息
    2, 如果你的网络是空闲的, 那么需要指定一个时间间隔(如20sec)向server发送心跳消息。
    所谓的心跳不过就是当网络空闲时,循环用指定的消息格式向服务器发送消息,服务器收到后也用指定的消息格式返回消息,双方确认都在线。

    如果你问的是后台的实现:
    1, 一个主机不可以一次只能响应一个client,你需要并发响应,否则client的使用就是恶梦。你可以自己写多线程来处理如何并发,书上都有实例可以抄。 但这样的效率相当低,并且你很难处理多线程间同步和死锁问题,所以Java4以后引入了NIO的机制来解决复杂的服务器并发编程,并且速度非常快, 但是NIO本身却也很复杂, 所以我建议采用第三方开源框架,如APACHE的MINA,不需要重复建造轮子。
    2, 但如果你的业务的确需要锁定资源,在同一时间的确只能许一个人响应,比如只想一份资料在同一时间只让一个人编辑等。 你可以先锁定资源,先来者先得,后来者也响应,但只响应一个提示消息,并不得到真正的资源。
    3, 所以,先来者因为己经正在读取资源,所以可以确定在线,不需要发送心跳,而后来者每次请求都有消息可以返回,要么是错误提示要么是心跳发送到服务器后的返回,所以只要有消息返回就可以确定双方都网络在线

    -----------------------------------------------------------------------------------------------------------

    client如何采用socket机制与后台通讯时,网络是长连接的,不像HTTP,
    HTTP每次发送消息时,会:
    1. create URL connection
    2. 获取inputstream 和outputstream
    3. 如果是POST,通过 stream 写入数据到后台
    4. 等待后台返回数据,并处理,最后回调自己的业务逻辑
    5. 必须关闭网络
    但Socket方式是明显不同的, 因为一旦create 连接并且后,就不需要每次都关闭连接。你只管发送消息,并且定时取消息。
    问题是,我只管从连接通道中取消息的话,怎么知道连接是好的。
    所以我们需要过一段时间就去试探一下连接是否好的,如果不是好的就重连一下。这就是发送心跳的目的。
    当然发送心跳包是要等网络空闭时才能发, 因为发送消息到后台也是需要消费网络带宽的,是需要时间的,如果发太多,或者正准备发送你的业务数据到后台之前就先发送了一堆心跳包到后台,则你的业务包要等待一段长时间,不是好的体验。
    那么怎以样才算网络空闭呢?
    这里要用到消息队列一个数组, 你每次需要向后台发送数据的时候都把数据封装成一个发送任务,放在你的消息队列里,你有一个线程,设每秒运行一次,每次运行时扫描队列是否有任务,如果有则发送到后台,没有则表示网络空闲,你的心跳计时器还发启动,计时到20秒时,插一个心跳任务到你的队列

    -------------------------------------------------------------------

    socket.io..和pomelo的socket都实现了心跳..

    1.服务端向客户端发送心跳..,客户端记录接受心跳的时间..

    2.客户端每隔一段时间检查,服务端的心跳时间是否大于超时时间久可以了....

    就是说.客户端不用去向服务端发送心跳.

  • 相关阅读:
    Sqlserver 批量数据更改
    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录
    SQLServer 与 MySQL
    MySQL 行号(类似SQLServer的row_number())
    c# 字符串排序 (面试题)
    c# 多线程里面创建byte数组发生内存溢出异常求解
    c# 遇到的问题,求解?
    solr-4.10.3.tgz.tgz下载
    VMware虚拟机克隆或复制linux后无法上网的解决方案
    通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明。
  • 原文地址:https://www.cnblogs.com/zhepama/p/3504508.html
Copyright © 2011-2022 走看看