即时通讯的业务场景和需求

即时通信(Instant Messaging,简称IM)是一个允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。 即时通讯技术应用于需要实时收发消息的业务场景。
现在各种各样的即时通讯软件也层出不穷:

  • 客服系统
    招商银行客服中心

  • 直播互动

  • 社交APP

  • 智能硬件,物联网

2 短连接和长连接

即时通讯使用的是长连接,这里我们介绍一下短连接和长连接。

2.1 短连接

客户端和服务器每进行一次通讯,就建立一次连接,通讯结束就中断连接。

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。HTTP/1.0使用的TCP默认是短连接。

2.2 长连接

是指在建立连接后可以连续多次发送数据,直到双方断开连接。

HTTP从1.1版本起,底层的TCP使用的长连接。
使用长连接的HTTP协议,会在响应头加入代码:Connection:keep-alive

2.3 短连接和长连接的区别

2.3.1 通讯流程

短连接:创建连接 -> 传输数据 -> 关闭连接 长连接:创建连接 -> 传输数据 -> 保持连接 -> 传输数据 -> …… -> 关闭连接

2.3.2 适用场景

短连接:并发量大,数据交互不频繁情况
长连接:数据交互频繁,点对点的通讯

2.3.3 通讯方式

方式 说明
短连接 我跟你发信息,必须等到你回复我或者等了一会等不下去了,就结束通讯了
长连接 我跟你发信息,一直保持通讯,在保持通讯这个时段,我去做其他事情的当中你回复我了,我能立刻你回复了我什么,然后可以回应或者不回应,继续做事

3 websocket协议

一、WebSocket是什么?

  • WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

    • 何谓全双工:全双工(Full Duplex)是通讯传输的一个术语。双方在通信时允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时进行信号的双向传输。指A→B的同时B→A,就像是双向车道。
    • 单工就就像是汽车的单行道,是在只允许甲方向乙方传送信息,而乙方不能向甲方传送 。
  • 参考资料:https://baike.baidu.com/item/%E5%85%A8%E5%8F%8C%E5%B7%A5/310007?fr=aladdin

  • 在 WebSocket中,浏览器和服务器只需要完成一次握手,就可以创建持久性的连接,并进行双向数据传输。

  • 在推送功能的实现技术上,相比使用Ajax 定时轮询的方式(setInterval),WebSocket 更节省服务器资源和带宽。

  • 服务器向客户端发送数据的功能是websocket协议的典型使用场景

二、为什么需要WebSocket?

我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便。

因此,随着HTML5的诞生,一种新的通信协议应运而生—WebSocket,他最大的特点就是服务端可以主动向客户端推送消息,客户端也可以主动向服务端发送消息,实现了真正的平等。

**举个例子:**如带有即时通信、实时数据、订阅推送等功能的应用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:ajax轮询(最原始的实现实时Web应用的解决方案)

**ajax轮询的原理:**ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。

场景再现:

客户端:有没有新信息(Request)
服务端:没有(Response)
客户端:有没有新信息(Request)
服务端:没有。。(Response)
客户端:有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:有没有新消息(Request)
服务端:有啦,给你。(Response)
客户端:有没有新消息(Request)
服务端:。。。。。没。。。。没。。。没有(Response) ---- loop

websocket的原理:当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

场景再现:

客户端:我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:好的,有的时候会告诉你的。
服务端:balabalabalabala
服务端:哈哈哈哈哈啊哈哈哈哈
服务端:笑死我了哈哈哈哈哈哈哈

三、WebSocket其他特点如下:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

四、创建WebSocket对象

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。当你获取 WebSocket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。

// url, 指定连接的 URL
// protocol 是可选的,指定可接受的子协议。
let Socket = new WebSocket(url, [protocol] );

五、WebSocket属性

  假设我们创建了一个Socket对象

属性 描述
Socket.readyState
只读属性 readyState 表示连接状态,可以是以下值:

0 - 表示连接尚未建立。

1 - 表示连接已建立,可以进行通信。

2 - 表示连接正在进行关闭。

3 - 表示连接已经关闭或者连接不能打开。

Socket.bufferedAmount 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

六、WebSocket事件

假设我们创建了一个Socket对象

事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose 连接关闭时触发

七、WebSocket方法

假设我们创建了一个Socket对象

方法 描述
Socket.send() 使用连接发送数据
Socket.close() 关闭连接

八、WebSocket实例

JavaScript

<!DOCTYPE html>
<html><head><meta charset="utf-8">
</head>
<style>
</style><body><input id="text" type="text" /><button onclick="send()">发送消息</button><button onclick="closeWebSocket()">关闭WebSocket连接</button><div id="message"></div><script>let websocket = null;//判断当前浏览器是否支持WebSocketif ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8080/websocket");} else {alert('当前浏览器不支持websocket!')}//连接发生错误的回调方法websocket.onerror = function () {console.log("WebSocket连接发生错误");};//连接成功建立的回调方法websocket.onopen = function () {console.log("WebSocket连接成功");}//接收到消息的回调方法websocket.onmessage = function (event) {document.getElementById('message').innerHTML += event.data + '<br/>';}//连接关闭的回调方法websocket.onclose = function () {console.log("WebSocket连接关闭");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function () {closeWebSocket();}//关闭WebSocket连接function closeWebSocket() {websocket.close();}//发送消息function send() {let message = document.getElementById('text').value;websocket.send(message);}</script>
</body></html>

Vue

<template><div><el-input v-model="params" clearable/><el-button type="primary" @click="send">发消息</el-button></div>
</template><script>export default {data() {return {params: '',path: "ws://localhost:8080/websocket",socket: ""}},mounted() {// 初始化this.init()},destroyed() {// 销毁监听this.socket.onclose = this.close},methods: {init: function () {if (typeof (WebSocket) === "undefined") {console.log("您的浏览器不支持socket")} else {// 实例化socketthis.socket = new WebSocket(this.path)// 监听socket连接成功回调this.socket.onopen = this.open// 监听socket连接失败回调this.socket.onerror = this.error// 监听后台返回的socket消息this.socket.onmessage = this.getMessage}},open: function () {console.log("socket连接成功")},error: function () {console.log("连接错误")},getMessage: function (msg) {console.log(msg.data)},send: function () {this.socket.send(params)},close: function () {console.log("socket已经关闭")}}}
</script>

即时通讯的业务场景和需求与短连接,长连接,Socket介绍大杂烩相关推荐

  1. 千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(一):功能设计与介绍

    引子 上周,和一投资大佬吃饭,闲谈间大佬聊到些趣事:说QQ当年想卖100万,结果被某老板嫌弃,说找上三个大学生,一个月便能做出一个来.结果没有卖成.我们听后哈哈一笑.大佬继续说:结果到现在过去20年了 ...

  2. JAVA社交平台项目第三天 即时通讯和接口加密

    第3章 - 即时通讯和接口加密 学习目标: 了解即时通讯业务场景和需求: 了解短连接和长连接 了解websocket协议 使用环信im云实现十次方即时通讯功能 了解接口加密业务需求 掌握常用加密算法和 ...

  3. 什么是长连接和短连接,他们的定义区别及应用场景?

    前提: HTTP/1.0默认使用短连接,HTTP/1.1开始默认使用长连接: HTTP协议的长连接和短连接,实质就是TCP协议的长连接和短连接: TCP协议建立连接需要3次握手,断开连接需要4次握手, ...

  4. 选型最佳实践|从业务场景分析直播SDK

    摘要 近两年即时通讯/直播产品炙手可热,市场上针对ToB的产品日益增多,企业该如何去选型呢?本文分享了笔者对于直播产品的思考,将从直播SDK实例功能特性.常见业务场景.注意事项及最佳实践等方面介绍如何 ...

  5. 即时通讯云服务·融云开发者沙龙活动(10月份)公告

    活动名称:让你的手机App"聊"起来 活动形式:免费参加的线下交流会 主讲人:杨攀 活动人数:限70人 报名方式:报名者给融云微信公众号发送如下消息内容即报名成功,"我要 ...

  6. IM即时通讯-从0到1的实践(一)

    先立个小目标:实现单聊 何为单聊呢:两个人之间的聊天,相对群聊而言 麻雀虽小五脏俱全,虽然说单聊是个小目标,但也在纵向上实现了IM即时通讯,也就是说包含了IM即时通讯必要的知识点. 需求细化: 1. ...

  7. 智慧水利水务数字孪生应用,典型业务场景分享

    <"十四五"智慧水利建设规划>中提出,以数字化.网络化.智能化为主线,以数字化场景.智慧化模拟.精准化决策为路径,以算据.算法.算力建设为支撑,以构建数字孪生流域为核心 ...

  8. 什么业务场景适合使用Redis?

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  9. 解读:在什么业务场景适合使用Redis?

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

最新文章

  1. mysql中union all的order by问题
  2. iOS开发之图片分辨率与像素对齐
  3. JavaWeb学习之路——SSM框架之Mybatis(二)
  4. C语言程序设计——设计一个学生管理系统(完美运行的程序(●‘◡‘●))
  5. 实验 4 [bx]和 loop 的使用
  6. OSChina 周六乱弹 —— 这个版本的小红帽听说过吗?
  7. 来了!汇总数据库行业最新招聘、热门资讯、精选文章...
  8. EnterCriticalSection 多线程操作相同数据遇到的问题(线程锁)
  9. GEO数据挖掘(学习笔记)
  10. 应用程序无法正常启动(0x000007b)或者找不到dll文件(以vcruntime140d.dll为例)的原因原理分析和解决方法(亲测已解决)
  11. 5000元组装电脑配置清单2021 5000元台式电脑组装配置单
  12. 在kindle上阅读网络小说的正确方法——Kindle网文助手
  13. iPaste:剪贴板界的一股清流
  14. QQ空间无敌装逼,复制下面的任一代码粘贴即可出现意想不到的图案。
  15. 头条小程序 button组件 设置边框问题
  16. Android 人脸解锁源码剖析
  17. 随机算法 之随机数的产生
  18. 【考研408】计算机与组成原理笔记
  19. 雨听 | 解除在微信公众平台中绑定的微信号
  20. 第十九章、主机名控制者: DNS 服务器

热门文章

  1. 强强联合丨酷雷曼与天翼云VR达成战略合作
  2. 在自定义View中onFinishInflate作用
  3. Directx11渲染管线概述
  4. np.random的各种不同用法
  5. 企业云成本优化:减少企业云支出的终极指南
  6. RISC-V开发与应用学习系列——Tang Nano 9K FPGA开发板介绍
  7. Bootstrap中的Affix插件
  8. 金三银四 “狂飙” 季,一波综合面试题来了
  9. 橱窗插花问题-动态规划
  10. 4.1输出“王者荣耀”的游戏角色