客户端与服务端长连接的几种方式

  • 前言
  • 一、ajax 轮询
  • 二、long poll 长轮询
  • 三、iframe 长连接
  • 四、WebSocket

前言

在日常 Web 项目中,通常使用的是短连接。即一个 Request 对应一个 Response,发起请求后建立TCP 连接,数据传输后连接关闭。但是对于股票信息更新、即时通讯、在线游戏这种数据交互频繁的场景就需要使用长连接。今天记录一下长连接的几种方式。

一、ajax 轮询

实现原理:ajax 轮询指客户端每间隔一段时间向服务端发起请求,保持数据的同步。

优点:可实现基础(指间隔时间较短)的数据更新。

缺点:这种方法也只是尽量的模拟即时传输,但并非真正意义上的即时通讯,很有可能出现客户端请求时,服务端数据并未更新。或者服务端数据已更新,但客户端未发起请求。导致多次请求资源浪费,效率低下。

二、long poll 长轮询

实现原理
long poll 指的是客户端发送请求之后,如果没有数据返回,服务端会将请求挂起放入队列(不断开连接)处理其他请求,直到有数据返回给客户端。然后客户端再次发起请求,以此轮询。在 HTTP1.0 中客户端可以设置请求头 Connection:keep-alive,服务端收到该请求头之后知道这是一个长连接,在响应报文头中也添加 Connection:keep-alive。客户端收到之后表示长连接建立完成,可以继续发送其他的请求。在 HTTP1.1 中默认使用了 Connection:keep-alive 长连接。

优点:减少客户端的请求,降低无效的网络传输,保证每次请求都有数据返回,不会一直占用线程。

缺点:无法处理高并发,当客户端请求量大,请求频繁时对服务器的处理能力要求较高。服务器一直保持连接会消耗资源,需要同时维护多个线程,服务器所能承载的 TCP 连接数是有上限的,这种轮询很容易把连接数顶满。每次通讯都需要客户端发起,服务端不能主动推送。

三、iframe 长连接

实现原理:
在网页上嵌入一个 iframe 标签,该标签的 src 属性指向一个长连接请求。这样服务端就可以源源不断地给客户端传输信息。保障信息实时更新。

优点:消息及时传输。

缺点:消耗服务器资源。

四、WebSocket

实现原理:
Websocket 实现了客户端与服务端的双向通信,只需要连接一次,就可以相互传输数据,很适合实时通讯、数据实时更新等场景。

Websocket 协议与 HTTP 协议没有关系,它是一个建立在 TCP 协议上的全新协议,为了兼容 HTTP 握手规范,在握手阶段依然使用 HTTP 协议,握手完成之后,数据通过 TCP 通道进行传输。

Websoket 数据传输是通过 frame 形式,一个消息可以分成几个片段传输。这样大数据可以分成一些小片段进行传输,不用考虑由于数据量大导致标志位不够的情况。也可以边生成数据边传递消息,提高传输效率。

与 HTTP 的区别:
以下是一个 WebSoket 协议的请求响应报文头,与 HTTP 协议的区别是:

  1. URL是以 ws: 开头,如果是对应的 HTTPS,则以 wss: 开头。WebSocket 使用 ws 或 wss 为统一资源标志符,其中 wss 表示在 TLS 之上的 Websocket。

  2. Status Code:101。该状态码表示协议切换。服务器返回了 101 ,表示没有释放 TCP 连接。WebSoket 协议握手阶段还是依赖于 HTTP 协议,到数据传输阶段便切换协议。

  3. Conection:upgrade,表示协议升级。在 HTTP 协议中,该请求头有两个值,一个是 close , HTTP/1.0 默认值,表示客户端或服务端想要关闭连接。另一个是 keep-alive,HTTP/1.1 默认值,表示长连接。

  4. 以下头部字段是只有 WebSocket 协议才有的字段。
    请求头:
    Sec-WebSocket-Extension:表示客户端协商的拓展特性。
    Sec-WebSocket-Key:是一个 Base64 encode 的密文,由浏览器随机生成,用来验证是否是 WebSocket 协议。
    Sec-WebSocket-Version:表示 WebSocket 协议版本。

    响应头:
    Sec-WebSocket-Extension:表示服务端支持的拓展特性。
    Sec-WebSocket-Accept:与客户端的 Sec-WebSocket-Key 相对应,是经过服务器确认,加密过后的 Sec-WebSocket-Key。

优点:

  1. 双向通信。客户端和服务端双方都可以主动发起通讯。
  2. 没有同源限制。客户端可以与任意服务端通信,不存在跨域问题。
  3. 数据量轻。第一次连接时需要携带请求头,后面数据通信都不需要带请求头,减少了请求头的负荷。
  4. 传输效率高。因为只需要一次连接,所以数据传输效率高。

缺点:

  1. 长连接需要后端处理业务的代码更稳定,推送消息相对复杂;
  2. 长连接受网络限制比较大,需要处理好重连。
  3. 兼容性,WebSocket 只支持 IE10 及其以上版本。
  4. 服务器长期维护长连接需要一定的成本,各个浏览器支持程度不一;
  5. 成熟的 HTTP 生态下有大量的组件可以复用,WebSocket 则没有,遇到异常问题难以快速定位快速解决。

客户端与服务端长连接的几种方式相关推荐

  1. FTP 编写 2:客户端与服务端的连接

    FTP 编写 2:客户端与服务端的连接     首先编写客户端与服务端能进行简单的连接,这个较为容易:     服务端的编写流程是:启动 Winsock.建立套接字.绑定套接字.监听.接收连接.关闭连 ...

  2. 2. ZK客户端与服务端建立连接的过程(基于NIO)

    ZK客户端与服务端建立连接的过程 引例 1. 启动SendThread 2. 状态初始化 3. 开始连接 4. 处理服务端连接响应 5. 流程图 在上一篇<客户端启动源码分析>文章中讲到了 ...

  3. SVN客户端和服务端的连接

    1. 当我们在某个文件夹中右键鼠标--SVN Checkout时,界面如下: 其中: 1)URL of repository是仓库地址, 仓库地址要怎么填写呢? 如果客户端和服务端在同一台电脑上,可以 ...

  4. python协程实现一万并发_python进阶:服务端实现并发的八种方式

    [本文导读]文中有许多不妥之处,敬请批评指正!python编写的服务端,有八种实现并发的方式,如阻塞(对等)套接字实现并发.非阻塞套接字实现并发.epoll实现并发.多进程实现并发.多线程实现并发.进 ...

  5. Socket 保证长连接的两种方式

    1.1 方法一:应用层自己实现的心跳包   由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在 ...

  6. ZooKeeper客户端源码(一)——向服务端建立连接+会话建立+心跳保持长连接

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 一.从ZooKeeper实例初始化开始 ZooKeeper 提供了原生的客户端库,虽然不好用,但 ...

  7. QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能

    Qt中使用Tcp构建通信客户端实现聊天信息发送连接等 1.简介 2.项目创建和界面构建 1)流程图 2)项目构建 3)界面构建 3.代码设计 1)项目pro添加 2)客户端设计 a. clientwi ...

  8. tcp网络编程客户端和服务端及listen和tcp允许最大连接数

    tcp网络编程 tcp网络编程步骤: 由于tcp传输特点是可靠有连接,那么就有 1.客户端向服务端发送连接请求(SYN), 2.服务端接受请求并向客户端发送(SYN+ACK); 3.客户端向服务端回复 ...

  9. java网络编程Socket实现客户端向服务端发送信息

    (可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...

最新文章

  1. python里面ca_Python SSL服务器提供中间CA证书
  2. 在普通Java类里使用spring里注入的service、dao等
  3. 过河问题matlab建模,matlab三对夫妻过河问题
  4. 【学习笔记】mybatis中的缓存介绍和使用
  5. java从入门到精通_Java入门到精通、学习路线、就业方向、薪资及前景分析(上篇)...
  6. C. 奇奇怪怪的魔法阵(未搞懂)
  7. ttl是什么意思啊_解读:单反和微单的区别是什么?摄影新手应该如何选择?
  8. Spring使用注解方式的学习笔记
  9. 华为路由器内部服务器地址映射不起作用,第一次买华为AR2204-s路由,内部服务器映射问题...
  10. 如何设置lazada促销活动--Flash Sale
  11. [记录]Cloudflare之WARP及其他app的DNS测试
  12. Java程序入门教程 | Java
  13. 【webpack】输入npm run dev报错: This is probably not a problem with npm. There is likely additional loggin
  14. 2022年全国PMP考试地点汇总,你都知道吗?
  15. 使用python导出msc.marc后处理数据——PyPost介绍
  16. 诺基亚e65 ucweb 6.7正式免签名下载
  17. 硬件学习(一)电容作用
  18. php搞笑证件,摆摊证制作软件app 摆摊证搞笑图片怎么做
  19. cartographer:论文阅读(Real-Time Loop Closure in 2D LIDAR SLAM)
  20. ESP32学习笔记(49)——RFID RC522使用

热门文章

  1. LightOJ-1070- Algebraic Problem (矩阵快速幂)
  2. Kali Linux镜像安装(2)
  3. 洲际酒店集团发起全球“洲全”清洁安全承诺 迎接宾客归来
  4. 查询社保信息显示内部服务器错误,社保费客户端登录服务器异常
  5. 高考就算失败了又如何?
  6. 微信小程序地图获取地点信息(打卡签到功能为例)-2020-7-26
  7. 酷派android升级失败,酷派手机怎么升级更新系统以及时解决系统BUG
  8. Netty源码(十五):Recycler工具类
  9. 日本小游戏-大家听说过「福笑い」吗?
  10. java创建List时候 初始化赋值