IM即时通讯

news/2024/10/29 1:30:48/

即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。
类型可分为两种:
在线推送

适用:web页面 和 App自己构建IM服务器
使用WebSocket 采用成熟的框架方案Socket.IO 对于App还可自己封装socket
使用第三方IM服务商提供的服务

离线推送

适用:App
对于iOS,使用APNs
对于andorid,使用FCM(国外)或第三方IM服务商提供的服务

提供第三方IM服务的服务商有:网易、融云…

需求场景:
服务器主动给客户端推送消息

用户下了订单,需要在运营管理后台向运营人员推送新订单通知
用户A关注了用户B,系统需要向用户B推送提示消息
即时聊天

WebSocket

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

Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如

ws://example.com/wsapi
wss://secure.example.com/

握手协议
WebSocket 是独立的、创建在 TCP 上的协议。 报文,为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)

Socket.IO

Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖,而且Socket.IO还在实现WebSocket协议时做了一些调整。

优点:

Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。
有Python库的实现,可以在Python实现的Web应用中去实现IM后台服务。

缺点

Socket.io并不是一个基本的、独立的、能够回退到其它实时协议的WebSocket库,它实际上是一个依赖于其它实时传输协议的自定义实时传输协议的实现。该协议的协商部分使得支持标准WebSocket的客户端不能直接连接到Socket.io服务器,并且支持Socket.io的客户端也不能与非Socket.io框架的WebSocket或Comet服务器通信。因而,Socket.io要求客户端与服务器端均须使用该框架。

Python服务器端开发

安装

pip install python-socketio

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

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

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。

方式2

作为Flask、Django 应用中的一部分

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

创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。

方式3
使用协程的方式运行 (推荐)

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

事件处理

编写事件处理方法,可以接收指定的事件消息数据,并在处理方法中对消息数据进行处理。

@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与自定义事件处理方法的函数传入参数不同

发送消息
群发

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

给指定用户发送

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

给一组用户发送
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')

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

sio.rooms(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)

Python客户端

import socketiosio = 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


http://www.ppmy.cn/news/700344.html

相关文章

拓扑是什么

拓扑(Topology)是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。拓扑只关注元素间位置关系,方便分析问题,如通过拓扑图可以很清晰的看清网络结构。 …

乐鑫ESP-RTC 实时音视频通信方案

乐鑫 ESP-RTC 实时音视频通信方案 乐鑫科技推出 ESP-RTC (Real-Time Communication) 音视频通信方案,能够实现稳定流畅、超低延时的语音和视频实时通信。 ESP-RTC 以乐鑫 ESP32-S3-Korvo-2 多媒体开发板为核心。ESP32-S3-Korvo-2 搭载 ESP32-S3 AI SoC,…

什么是迅驰技术?

什么是迅驰技术? 它是英特尔于2003年3月12日,面向笔记本电脑推出的无线移动计算技术的品牌名称。迅驰(Centrino)是:Centre(中心)与Neutrino(中微子)两个单词的缩写。它由三部分组成:移动式处理器…

中兴通讯5G OLT应急抢通解决方案荣获2022年度大奖!

近日,在通信世界全媒体举办的“2023 ICT行业趋势年会暨2022年度ICT产业龙虎榜颁奖盛典”上,中兴通讯5G的OLT应急抢通解决方案成功斩获了“2022年度最佳接入网技术创新”奖。据介绍,该解决方案能够进一步缩短故障处理时间,提升业务…

网络拓扑图制作软件

1.亿图图示(EdrawMax) 最像VISIO的网络拓扑制作工具 亿图图示实际上就是国产的Visio,与Visio非常相似。支持B/S架构,查看拓扑非常方便,模版也比较丰富。缺点与Visio也类似,画简单的网络拓扑没有问题,但针对大型网络拓扑管理而言,既需要能制作拓扑,又需要具有管理分析…

企业即时通讯需要哪些功能?如何快速实现即时通讯

即时通讯软件现在有分为两种,一种是个人社交沟通软件,另外一种则是企业即时通讯,企业即时通讯的功能要比个人社交沟通软件要全面,毕竟是为了让企业内部方便沟通、管理及办公。那么企业即时通讯软件除了社交聊天功能之外&#xff0…

SaaSBase:什么是讯众通信?

作为SaaS产品的发掘者,SaaSBase(saasbase.cn)今天带大家了解一个优秀的客户服务(即时聊天)软件:讯众通信——国内较早提出云通讯概念的服务商, 基于互联网SIP通信协议, 为互联网及移动互联网企业提供全面的…

IM即时通讯-1-项目需求说明书

即时通讯的项目需求说明书 一、背景 即时通讯是现代交流的重要技术,它可以更方便快捷的进行群聊、聊天等功能,以便满足用户之间的沟通要求。 即时通讯是一种基于网络的实时通信工具,它能够使各种跨设备的用户在网络中实现实时信息交换&…