即时通讯

来源: 简书 2020-03-02 10:26:07


websocket连接过程

即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。
类型:

  • 在线push
    • 使用WebSocket
    • 采用成熟的框架方案Socket.IO
    • 对于App还可自己封装socket
    • 适用:web页面 和 App
    • 自己构建IM服务器
    • 使用第三方IM服务商提供的服务
  • 离线push
    • 适用:App
    • 对于iOS,使用APNs
    • 对于andorid,使用FCM(国外)或第三方IM服务商提供的服

提供第三方IM服务的服务商有:

  • 网易云信
  • 融云
  • 环信
  • LeanCloud
  • 哇谷

传统的推送实现
注意:HTTP/1.x 不支持服务器主动推送,只能在客户端发起请求后做出回应。 (HTTP/2支持服务器主动推送,但HTTP/2 还未全面实施)

  • 轮询

    轮询是在特定的的时间间隔(如每1秒),由客户端对服务器发出HTTP请求,了解服务器有没有新的信息,然后由服务器告知有无新数据或返回最新的数据给客户端。

    缺点:

    • 效率低下,浪费资源

    • 必须不停连接,或者连接始终打开,但传输HTTP请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

  • Comet (基于长连接)

    缺点:

    • 依然需要反复发出请求,而且长连接也会消耗服务器资源。
    • 长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。
    • iframe流 iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

WebSocket
HTML5定义了WebSocket协议。
WebSocket是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连接后传输一次握手数据),两者之间就直接可以创建持久性的连接,并进行双向数据传输。


Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。
ws和HTTP一样,用80端口。wss和HTTPS一样,用443端口。wss表示在TLS之上的Websocket。




握手协议
WebSocket 是独立的、创建在 TCP 上的协议。
Websocket 通过 HTTP/1.1 协议的101状态码进行握手。
为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。
websocket优点:


  1. 较少的控制开销。相对于HTTP每次请求都携带完整头部,此项开销显著减少了。
    2.更强的实时性。全双工协议,故服务器可以随时主动给客户端下发数据。
    3.保持连接状态。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
    4.可以支持扩展。
    5.更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
    6.没有同源限制,客户端可以与任意服务器通信。
    7.可以发送文本,也可以发送二进制数据。
    Socket.IO
    同时支持websocket协议和HTTP1.x协议的框架。使用原因就是虽然websocket是主流浏览器都在用,但并不是所有,所以对于未使用websocket协议的浏览器需要使用轮询。socket.io就是封装了这两个协议的框架,自动切换协议。
    Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。
    Socket.IO 主要使用WebSocket协议。但并不是只能使用WebSocket协议,也可以使用其他诸如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取方法。
    Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖,而且Socket.IO还在实现WebSocket协议时做了一些调整。
    Socket.IO优点:

    Socket.IO缺点:

    • Socket.io并不是一个基本的、独立的、能够回退到其它实时协议的WebSocket库,它实际上是一个依赖于其它实时传输协议的自定义实时传输协议的实现。该协议的协商部分使得支持标准WebSocket的客户端不能直接连接到Socket.io服务器,并且支持Socket.io的客户端也不能与非Socket.io框架的WebSocket或Comet服务器通信。因而,Socket.io强制要求客户端与服务器端均须使用该框架
      python服务器端开发文档:https://python-socketio.readthedocs.io/en/latest/server.html
    • Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。
    • 有Python库的实现,可以在Python实现的Web应用中去实现IM后台服务。
创建服务器:

1.方式一:
使用多进程多线程模式的WSGI服务器对接(如uWSGI、gunicorn)

import socketio  

  # create a Socket.IO servers
  sio = socketio.Server()

  # 打包成WSGI应用,可以使用WSGI服务器托管运行
  app = socketio.WSGIApp(sio)  # Flask  Django

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
2.方式二:
作为Flask、Django 应用中的一部分

from wsgi import app  # a Flask, Django, etc. application
  import socketio  # create a Socket.IO server
  sio = socketio.Server()

  app = socketio.WSGIApp(sio, app)

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
3.方式三:
使用协程的方式运行 (推荐)

import eventlet
  eventlet.monkey_patch()

  import socketio  import eventlet.wsgi

  sio = socketio.Server(async_mode='eventlet')  # 指明在evenlet模式下
  app = socketio.Middleware(sio)
  eventlet.wsgi.server(eventlet.listen(('', 8000)), app)

注意:因为服务器与客户端进行即时通信时,会尽可能的使用长连接,所以若服务器采用多进程或多线程方式运行,受限于服务器能创建的进程或线程数,能够支持的并发连接客户端不会很高,也就是服务器性能有限。采用协程方式运行服务器,可以提升即时通信服务器的性能。

事件处理

不同于HTTP服务的编写方式,SocketIO服务编写不再以请求Request和响应Response来处理,而是对收发的数据以消息(message)来对待,收发的不同类别的消息数据又以事件(event)来区分。

原本HTTP服务编写中处理请求、构造响应的视图处理函数在SocketIO服务中改为编写收发不同事件的事件处理函数。
1.事件处理方法
编写事件处理方法,可以接收指定的事件消息数据,并在处理方法中对消息数据进行处理。

@sio.on('connect')def on_connect(sid, environ):
    """
    与客户端建立好连接后被执行
    :param sid: string sid是socketio为当前连接客户端生成的识别id
    :param environ: dict 在连接握手时客户端发送的握手数据(HTTP报文解析之后的字典)
    """
    pass@sio.on('disconnect')def on_disconnect(sid):
    """
    与客户端断开连接后被执行
    :param sid: string sid是断开连接的客户端id
    """
    pass# 以字符串的形式表示一个自定义事件,事件的定义由前后端约定@sio.on('my custom event')  def my_custom_event(sid, data):
    """
    自定义事件消息的处理方法
    :param sid: string sid是发送此事件消息的客户端id
    :param data: data是客户端发送的消息数据
    """
    pass

注意:

  • connect 为特殊事件,当客户端连接后自动执行

  • disconnect 为特殊事件,当客户端断开连接后自动执行

  • connect、disconnect与自定义事件处理方法的函数传入参数不同

2.发送事件消息
2.1 群发

sio.emit('my event', {'data': 'foobar'})

2.2 给指定用户发送

sio.emit('my event', {'data': 'foobar'}, room=user_sid)

2.3 给一组用户发送
SocketIO提供了房间(room)来为客户端分组。

sio.enter_room(sid, room_name)

将连接的客户端添加到一个room

@sio.on('chat')
  def begin_chat(sid):
      sio.enter_room(sid, 'chat_users')

注意:当客户端连接后,socketio会自动将客户端添加到以此客户端sid为名的room中

sio.leave_room(sid, room_name)

将客户端从一个room中移除

@sio.on('exit_chat')
  def exit_chat(sid):
      sio.leave_room(sid, 'chat_users')

sio.rooms(sid)

查询sid客户端所在的所有房间

给一组用户发送消息的示例

@sio.on('my message')def message(sid, data):
  sio.emit('my reply', data, room='chat_users')

也可在群组发消息时跳过指定客户端

@sio.on('my message')def message(sid, data):
  sio.emit('my reply', data, room='chat_users', skip_sid=sid)

使用send发送message事件消息
对于'message'事件,可以使用send方法

sio.send({'data': 'foobar'})
  sio.send({'data': 'foobar'}, room=user_sid)
  1. python客户端

import socketio

sio = socketio.Client()@sio.on('connect')def on_connect():
    pass@sio.on('event')def on_event(data):
    passsio.connect('http://10.211.55.7:8000')sio.wait()
测试即时通讯

使用firecamp.app进行测试










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

相关文章

即时通讯

即时通讯im

什么是私有云?

im 移动社交聊天APP

Im通讯有哪些APP

如何选择即时通讯软件?

推荐一款好用的企业办公聊天APP

使用企业IM要不要收费

IM软件要多少钱?‍‍有必要定制么?

有没有必要开发企业聊天APP

企业IM是什么,有什么使用优势?

哇谷IM有什么特点,为什么很多企业在使用?

即时通讯私有化部署是什么?

企业即时通讯的使用价值有哪些

企业聊天APP有什么作用,可以带来哪些便利?

企业即时通讯软件支持多设备登陆吗?

购买海外云服务器注意避免这些误区

怎么样正确认识海外云服务器

员工上网影响效率 关闭外网做内网必备聊天APP

即时通讯软件是否具有聊天回执的功能?

即时通讯聊天APP是否支持消息漫游

即时通讯软件可以发送表情和语音么?

即时通讯软件支持群聊和音视频功能么?

有微信有QQ,为啥还要定制即时通讯软件?

IM软件功能丰富 随心所欲定制您需要的功能

盘点全球几大即时通讯软件

介绍两款国外大佬级别的即时通讯APP

原创互联网未来世界企业政府通讯APP办公节约成本类似马云思维-哇谷IM

免费十万SEO优化超级外链工具各大站长工具

敲黑板,企业聊天APP这些事项一定要注意!

JM沟通优势有哪些,安全性怎么样?

JM沟通app即时通讯聊天系统功能介绍

jm沟通 企业即时通讯有什么特点,为什么受欢迎?

JM沟通实现零距离交流 成现代企业办公的必备

即时通讯私有化完整版源代码分析后台数据库说明

即时通讯IM融云世界

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?

IM云系统即时通讯公有云、私有云、企业云、海外云-哇谷IM团队

2.0哇谷即时通讯系统正式上线适合大型项目运营超稳定性

哇谷科技JM沟通即时通讯内核升级新版哇谷2.0即将上线

im即时通讯社交软件APP红包技术分析(五):微信红包、聊呗红包、诚信红包、高并发技术

im即时通讯-微信红包、支付宝红包、聊呗红包、诚信红包、谈功能逻辑、容灾、运维、架构等。Q红包

更多文章

.

 企业即时通讯服务 | 商用红包功能构架 | 哇谷IM首页 | JM沟通IM下载 | IM功能与价格 | 即时通讯动态 | 热门动态 | 关于哇谷 |联系我们