利用socket.io建立消息推送系统

简介

由于最近接触了socket.io方面的知识,了解到作为基于websocket进行封装的socket.io,但是又不是完全基于websocket。在消息接受发送方面有很强的实时性,这个特性对于消息推送场景是很契合的,于是打算从这方面入手。


方案一

为了实现相互之间的解耦,以下分为几个角色,分别为主业务服务器(Server)、Socket.io通道管理服务器(Socket.io)、用户(client)。


方案1.png

首先,是通过客户端,就是client,发送HTTP请求到Server上,比如说用户输入了用户名和密码,发送到服务端(Server)去进行验证,验证通过之后,Server发送成功的消息到socket.io处,将与client端的通信打开,实现消息的实时推送功能。但是在实现过程中的问题在于,由于要经过http请求才能打开通信通道,在http方法里定义socket,此时消息从client到达Server速度很快,但是在从sokcet.io到client的时候,速度变得很慢,原因目前未知,方案在原理上是说得通的,只是具体实现有困难。
首先需要说明的是,这个方案利用JWT(Json Web Token),客户端先通过Server进行用户名与密码的验证,通过之后,会给客户端返回一个经过加密的token,也就是jwt。之后,用户访问Server的一个url,其中需要bearToken才能进行访问,访问之后,在其路由里定义相关动作,将成功访问的消息发送至Socket.io处,将连接建立起来,此时的连接指的是socket.io和client之间的websocket连接


方案二

这个方案具体是通过socket.io中的命名空间来实现对于各个用户的指定连接,利用第三方包socketio-auth来进行相关账户连接的认证,如果认证通过,则连接成功,否则,失败。但是由于这个方案socketio这部分和主业务服务器耦合度太高,无法实现socketio的重复利用。
具体情况是,在socket.io和client之间的连接已经建立,但是没有emit任何信息。socketio-auth里面具体的配置情况如下

socketioAuth(socket,{
    authenticate: authenticate,
    postAuthenticate: postAuthenticate,
    timeout: 1500
})

首先先经过authenticate,如果验证成功之后,再进入下一步,即postAuthenticate,之后将验证成功的用户添加到socket.client.user中去,建立相关连接。如果验证不成功,直接执行disconnect来终止连接。
总而言之,整个流程走下来,先是在client和socketio处建立连接,但是这个连接没有保障性,没有发送任何信息。之后验证成功之后,再通过用户名建立一个更加私密的连接,也就是通过用户名来创建namespace来建立连接,之后的消息发送以及监听走的均是这个私密的连接。


方案三

为了达到解耦目的,以及免除方案一的繁琐方案,目前的方案三的大致图如下


image.png

首先,这里假设用户是已经经过验证过的用户,用户首先与Socket.io建立连接,这个连接是客户端连接到Socket.io的主域名上,连接之后,Client发送一个登陆消息,将自身的信息发送给Socket.io去保存,目前只是简单的在socket.io建立一个空的数组来保存这些信息,实际工程上应该保存在数据库上。连接成功之后。再进行下一步,即比如用户触发一个按钮,比如说点击了购买的按钮,然后Server端通过这个按钮绑定的事件,获取点击按钮的用户(Client)信息,将获取到的tokenId以及点击之后需要向用户推送的信息,经过包装之后,通过POST方式将信息发送至Socket.io服务端。之后,Socket.io通过获取到的具体tokenId。然后和保存的tokenId进行对比,如果有存在与之匹配的,就建立一对一映射关系的连接,将信息推送到客户端(Client)。
这样一来,就能很好的将主要业务服务器Server和Socket.io分离开来,Socket.io就可以给不同的服务器之间共用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,264评论 0 5
  • 作者:詹聪聪 序言: 本人工作中需要用到flask-socketio,在学习英文文档时发现,flask-socke...
    Python中文社区阅读 12,600评论 6 39
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,392评论 0 11
  • 为什么很讨厌那个女人呢?因为她强势霸道? 好像不仅仅是,一个领导者,就是她口中所谓的leader是需要具备让人信服...
    咿呀学步的树懒阅读 110评论 0 0