Socket搭建即时通讯服务器

即时通讯

相关代码Demo地址, 内附服务端代码和 端聊天室测试

即时通讯 是一个终端服务,允许两人或多人使用网路即时的传递文字讯息、档案、语音与视频交流

即时通讯按使用用途分为企业即时通讯和网站即时通讯

根据装载的对象又可分为手机即时通讯和PC即时通讯,手机即时通讯代表是短信,网站、视频即时通讯

IM通信原理

客户端A与客户端B如何产生通信?客户端A不能直接和客户端B,因为两者相距太远。

这时就需要通过IM服务器,让两者产生通信.

客户端A通过socket与IM服务器产生连接,客户端B也通过socket与IM服务器产生连接

A先把信息发送给IM应用服务器,并且指定发送给B,服务器根据A信息中描述的接收者将它转发给B,同样B到A也是这样。

通讯问题: 服务器是不能主动连接客户端的,只能客户端主动连接服务器

即时通讯连接原理

即时通讯都是长连接,基本上都是HTTP1.1协议,设置 为 即可实现长连接,而 默认是长连接,也就是默认 的值就是

HTTP分为长连接和短连接,其实本质上是TCP连接,HTTP协议是应用层的协议,而TCP才是真正的传输层协议, IP是网络层协议,只有负责传输的这一层才需要建立连接

例如: 急送一个快递,HTTP协议指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求。而TCP协议就是中间运货的运输工具,它是负责运输的,而运输工具所行驶的路就是所谓的TCP连接

HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建立连接。

HTTP长连接(持久连接)是指,客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接可以设置过期时间,也可以不设置

即时通讯数据传递方式

目前实现即时通讯的有四种方式(短轮询、长轮询、SSE、 )

短轮询:

每隔一小段时间就发送一个请求到服务器,服务器返回最新数据,然后客户端根据获得的数据来更新界面,这样就间接实现了即时通信

优点是简单,缺点是对服务器压力较大,浪费带宽流量(通常情况下数据都是没有发生改变的)。

主要是客户端人员写代码,服务器人员比较简单,适于小型应用

长轮询:

客户端发送一个请求到服务器,服务器查看客户端请求的数据(服务器中数据)是否发生了变化(是否有最新数据),如果发生变化则立即响应返回,否则保持这个连接并定期检查最新数据,直到发生了数据更新或连接超时

同时客户端连接一旦断开,则再次发出请求,这样在相同时间内大大减少了客户端请求服务器的次数.

弊端:服务器长时间连接会消耗资源,返回数据顺序无保证,难于管理维护

底层实现:在服务器的程序中加入一个死循环,在循环中监测数据的变动。当发现新数据时,立即将其输出给浏览器并断开连接,浏览器在收到数据后,再次发起请求以进入下一个周期

SSE

( 服务器推送事件):为了解决浏览器只能够单向传输数据到服务端,HTML5提供了一种新的技术叫做服务器推送事件SSE

SSE技术提供的是从服务器单向推送数据给浏览器的功能,加上配合浏览器主动HTTP请求,两者结合起来,实际上就实现了客户端和服务器的双向通信.

WebSocket

以上提到的这些解决方案中,都是利用浏览器单向请求服务器或者服务器单向推送数据到浏览器

而在HTML5中,为了加强web的功能,提供了 技术,它不仅是一种web通信方式,也是一种应用层协议

它提供了浏览器和服务器之间原生的全双工跨域通信,通过浏览器和服务器之间建立 连接,在同一时刻能够实现客户端到服务器和服务器到客户端的数据发送

WebSocket

WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准

是一种双向通信协议,在建立连接后, 服务器和客户端都能主动的向对方发送或接收数据

是基于 协议的,或者说借用了 协议来完成一部分握手(连接),在握手(连接)阶段与 是相同的,只不过 不能服务器给客户端推送,而 可以

WebSocket如何工作

Web浏览器和服务器都必须实现 协议来建立和维护连接。

由于 连接长期存在,与典型的 连接不同,对服务器有重要的影响

基于多线程或多进程的服务器无法适用于 ,因为它旨在打开连接,尽可能快地处理请求,然后关闭连接

任何实际的 服务器端实现都需要一个异步服务器

协议

协议头: ws, 服务器根据协议头判断是 还是

WebSocket客户端

在客户端,没有必要为 使用 库。实现 的 浏览器将通过 对象公开所有必需的客户端功能(主要指支持 的浏览器)

客户端 API

以下 API 用于创建 对象。

以上代码中的第一个参数 , 指定连接的

第二个参数 是可选的,指定了可接受的子协议

WebSocket属性

以下是 对象的属性。假定我们使用了以上代码创建了 对象

: 只读属性 表示连接状态, 可以是以下值

0 : 表示连接尚未建立

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

2 : 表示连接正在进行关闭

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

: 只读属性

表示已被 放入正在队列中等待传输,但是还没有发出的 文本字节数

WebSocket事件

以下是 对象的相关事件。假定我们使用了以上代码创建了 对象:

WebSocket方法

以下是 对象的相关方法。假定我们使用了以上代码创建了 对象:

示例

WebSocket服务端

在服务端的实现非常丰富。 、 、 、 等多种语言都有自己的解决方案, 其中 常用的有以下三种

µWebSockets

Socket.IO

WebSocket-Node

下面就着重研究一下 吧, 因为别的我也不会, 哈哈哈哈......

Socket.IO是一个库,可以在浏览器和服务器之间实现实时,双向和基于事件的通信

Socket.IO是一个完全由 实现、基于 、支持 的协议用于实时通信、跨平台的开源框架

Socket.IO包括了客户端( )和服务器端( )的代码,可以很好的实现iOS即时通讯技术

Socket.IO支持及时、双向、基于事件的交流,可在不同平台、浏览器、设备上工作,可靠性和速度稳定

Socket.IO实际上是 的父集, 封装了 和轮询等方法,会根据情况选择方法来进行通讯

典型的应用场景如:

实时分析:将数据推送到客户端,客户端表现为实时计数器、图表、日志客户

实时通讯:聊天应用

二进制流传输: 支持任何形式的二进制文件传输,例如图片、视频、音频等

文档合并:允许多个用户同时编辑一个文档,并能够看到每个用户做出的修改

Socket.IO服务端

Socket.IO实质是一个库, 所以在使用之前必须先导入 库

导入库和 导入第三方库性质一样, 只不过 使用的是 管理, 使用

导入 库

创建socket

本质还是 协议,所以需要绑定 服务器,才能启动socket服务.

而且需要通过 服务器监听端口, 不能监听端口,有人访问端口才能建立连接,所以先创建 服务器

建立socket连接

服务器不需要主动建立连接,建立连接是客户端的事情,服务器只需要监听连接

客户端主动连接会发送 事件,服务端只需要监听 事件有没有发送,就知道客户端有没有主动连接服务器

本质是通过发送和接受事件触发服务器和客户端之间的通讯,任何能被编辑成 或二进制的对象都可以传递

: 监听事件,这个方法会有两个参数,第一个参数是事件名称,第二个参数是监听事件的回调函数,监听到链接就会执行这个回调函数

监听 ,回调函数会传入一个连接好的 ,这个 就是客户端的

连接原理,就是客户端和服务端通过 连接,服务器有 ,客户端也有

Socket.IO客户端

Socket.IO-Client-Swift是 使用的库, 目前只有 版本

iOS中的使用

创建socket对象

创建 对象, 两种创建方式

: 是一个数组, 等同于

的所有取值如下

创建

监听连接

创建好 对象,然后连接用 方法

因为 需要进行3次握手,不可能马上建议连接,需要监听是否连接成功的回调,使用 方法

方法两个参数

参数一: 监听的事件名称,参数二:监听事件回调函数,会自动调用

回调函数也有两个参数(参数一:服务器传递的数据 参数二:确认请求数据 )

在 协议中,如果接收方成功的接收到数据,那么会回复一个 数据- 只是一个标记,标记是否成功传输数据

完整代码

SocketIO事件

通过事件链接服务器和传递数据

客户端监听事件

客户端发送事件

只有连接成功之后,才能发送事件

服务器监听事件

监听客户端事件,需要嵌套在连接好的 回调函数中

必须使用回调函数的 参数,如 中的s,监听事件,因此这是客户端的 ,肯定监听客户端发来的事件

服务器监听连接的回调函数的参数可以添加多个,具体看客户端传递数据数组有几个,每个参数都是与客户段一一对应,第一个参数对应客户端数组第0个数据

服务器发送事件

这里的 一定要用服务器端的

SocketIO分组

每一个客户端和服务器只会保持一个 链接, 那么怎么吧每一条信息推送到对应的聊天室, 针对多个聊天室的问题有如何解决

给每个聊天室都分组, 服务器就可以给指定的组进行数据的推送, 就不会影响到其他的聊天室

如何分组

提供rooms和namespace的API

用 的API就可以实现多房间聊天了,总结出来无外乎就是: 和

这里的 是客户端的 ,也就是连接成功,传递过来的

分组的原理

只要客户端 调用 ,服务器就会把客户端 和分组的名称绑定起来

到时候就可以根据分组的名称找到对应客户端的 ,就能给指定的客户端推送信息

一个客户端 只能添加到一组,离开的时候,要记得移除

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181116G1ERC500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券