推送服务之socket.io

一、作者自述

  从事软件开发3年了,出于各种原因(其实是因为我懒,啊哈哈~),第一次决定动手写点什么。第一呢,给自己一个总结的机会,梳理下自己的知识库。第二呢,同第一点。。。

  自从大学毕业后,一直处于一种“极度”的繁忙之中。从刚开始入行时各种学习的“饥渴”状态,到后来工作需要的“填鸭”状态,一直在学,一直在用,边用边学。刚开始接触的知识面比较窄,但随着工作的变换,能力的提升,接触的东西越来越多了。慢慢的,自己越来越感觉知识杂乱,缺乏梳理。因此,决定开通博客,时不时的记录下自己新学的知识,整理下已经学过的知识,偶尔来灵感了,也可以总结一下。

二、推送服务之socket.io

  目前来说,接触到的推送服务也有几个了。比如signalr,socket.io,super websocket。除此之外还有其他第三方推送服务。对于一个前后端都得啃的苦逼猿来说,总体感觉原理都是差不多的。最大的不同可能就是其实现方式的不同了。在此不多做追述,有兴趣的童鞋可以自行百度。

  今天来重点说下socket.io。接触socket.io是因为公司要开发一款棋牌游戏,决定使用socket.io作为推送服务。和前面说的另外两个推送不一样,socket.io是跑在node环境下的服务。不得不说,JS编程确实快捷简单。没用过node的童鞋,可以找度娘。废话不多说,直接上代码。

socket.io服务端代码:

 1 var app = require(‘http‘).createServer(handler)
 2 var io = require(‘socket.io‘)(app);
 3 var fs = require(‘fs‘);
 4
 5 app.listen(80);
 6
 7 io.on(‘connection‘, function (socket) {
 8   socket.emit(‘news‘, { hello: ‘world‘ });
 9   socket.on(‘my other event‘, function (data) {
10     console.log(data);
11   });
12 });

socket.io客户端代码:

1 <script src="/socket.io/socket.io.js"></script>
2 <script>
3   var socket = io(‘http://localhost‘);
4   socket.on(‘news‘, function (data) {
5     console.log(data);
6     socket.emit(‘my other event‘, { my: ‘data‘ });
7   });
8 </script>

简单解释下

<script src="/socket.io/socket.io.js"></script>

该行代码用来指示socket.io服务所在地址。若服务端与客户端不在同一项目内,则需要添加上服务所在具体域名或者IP和端口。

至此,我们的推送服务带客户端简单交互已经完成了。当然,相当的简陋。此例就是官方给出的demo,非常的简单,直白。但是我们在实际的运用当中,需求肯定不会如此的简单。

先说下socket.io的部分API,1.0版本之前的API和1.0之后版本的API已经有所不同了(其实我感觉这里描述为事件更贴切)。这里简单列下1.0版本之后的API。

socket.io 提供了默认事件(如:connect, message, disconnect)。另外,socket.io允许发送并接收自定义事件。

自定义事件:

1 socket.on(‘send message‘, function(data) {
2   console.log(‘send message:::::::::‘, data);
3 });

事件的定义基本不变。所有的事件基本都是这个格式。

执行事件:

socket.emit("send message", {msg: ‘test send messsage‘});

这是个最基本的事件执行代码。其作用是返回一段提示信息给自己。其他人无法接收到。如果我们要给别人发送消息怎么办呢??

io.sockets.connected[socket.id].emit(‘send message‘, {msg: ‘test specific message‘});

此行代码的作用就是给特定socket发送消息。只需要知道目标的socketId即可。因此,服务端最好要实现处理用户和socke关系的业务。

socket.broadcast.to(socket.id).emit(‘send message‘, {msg: ‘test specific message by room‘});

这行代码的效果和上面一样是一样的。用户在建立socket链接后,默认都会加入一个room,该room的ID就是socket的ID。相当于一个特定的房间内只有一个用户。我们想该房间通知消息,该用户就可以接收到。不同的是上面的代码可以给自己发送消息,而本行代码不行,只能给别人发送消息。

广播消息:

1 //全局广播消息(不包含自己)
2 socket.broadcast.emit(‘broadcast message‘, {msg: ‘test broadcast message‘});
3 //房间内广播消息(不包括自己)
4 socket.broadcast.to(‘cg room‘).emit(‘broadcast message to room‘, {msg: ‘test broadcast message to room‘});
5 //全局广播消息(包括自己)
6 io.sockets.emit(‘broadcast message all‘, {msg: ‘test broadcast message to all‘});
7 //房间内广播消息(包括自己)
8 io.sockets.to(‘cg room‘).emit(‘broadcast message all in room‘, {msg: ‘test broadcast message to all in room‘});

这几行代码的作用是向某一范围内,所有已链接的socket发送消息。网上看到想房间内发送消息的时候,有的用in,有的用to,区别是in自己可以接收到,to自己接收不到。但我测试的结果是这俩其实是一样的。想房间内通知消息,是否需要屏蔽自己,也不是通过in和to来区分的。这可能是老版本和新版本的区别吧。

  推送,其实就是客户端A向服务器主动发送一条消息,服务器收到并根据要求进行转发,此时B客户端作为接收方,被动的接收服务器转发过来的数据。当然,中间涉及到用户状态的变更和维护。这里不做描述。而某些情况下,我们需要知道服务器或者客户端是否收到了发送过去的数据,我们可以发送带有确认机制的消息:

//Sending and getting data (acknowledgements)
socket.emit(‘ack message‘, {msg: ‘test ack message‘}, function (data){
    //回掉返回的确认消息,可以为任意JS支持的类型
    console.log(data);
});

其对应的事件定义方式需要改动一下:

socket.on(‘ack message‘, function(data, fn) {
    console.log(‘ack message:::::::::‘, data);
    fn(true);
});

此外,socket.io还提供一种消息发送机制volatile messages。意思大概是说,当服务器发送数据时,客户端因为各种原因不能正常接收,比如网络问题、或者正处于长连接的建立连接阶段。此时会让我们的应用变得 suffer(意会一下),那就需要考虑发送 volatile 数据。即使客户端没连线,一样可以这样发送,服务器会自动丢弃发送失败的数据。这里提供一个官方demo:

 1 var io = require(‘socket.io‘)(80);
 2
 3 io.on(‘connection‘, function (socket) {
 4   var tweets = setInterval(function () {
 5     getBieberTweet(function (tweet) {
 6       socket.volatile.emit(‘bieber tweet‘, tweet);
 7     });
 8   }, 100);
 9
10   socket.on(‘disconnect‘, function () {
11     clearInterval(tweets);
12   });
13 });

房间和命名空间

  这里不再具体赘述,官网给的demo已经和详细了。有需求的同学可以自行查看文档。

最后

  第一次写博客,很多地方都写的比较简陋,望请谅解!

时间: 2024-10-25 01:34:37

推送服务之socket.io的相关文章

基于netty-socketio的web推送服务

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端. 有哪些可以实现web消息推送的技术: 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新.但是间隔多长时间去查询成了问题,因为性能和即

巧用apache httpcore-nio实现android推送服务

1. 背景 Android推送服务应用非常广泛,一般有轮询.SMS推送.IP推送几种实现方式.由于轮询的即时性不高.SMS推送需要不菲的费用,所以一般采取IP推送.由于google的IP推送平台C2DM国内被屏蔽,国内涌现很多优秀的推送平台如个推.极光推送.由于实现推送服务有一定技术难度,很多移动互联网应用直接租用这些平台服务,达到快速拓展业务的目标. 但是在一些企业和行业应用场合,限制手机接入互联网,不能采用互联网推送平台,就必须实现自己的推送服务.国内流行的方案是采用开源的androidpn

【netty】Netty系列之Netty百万级推送服务设计要点

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

Netty系列之Netty百万级推送服务设计要点

原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发

手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法:

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢: 在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手

APNS push server端 SSL3.0 转 TLS (iPhone苹果推送服务)

(转载此文,请说明原文出处) 苹果的官方公布 Update to the Apple Push Notification Service October 22, 2014 The Apple Push Notification service will be updated and changes to your servers may be required to remain compatible. In order to protect our users against a recent

APNS push 服务器端 SSL3.0 转 TLS (iPhone苹果推送服务)

苹果的官方发布 Update to the Apple Push Notification Service October 22, 2014 The Apple Push Notification service will be updated and changes to your servers may be required to remain compatible. In order to protect our users against a recently discovered s

Netty系列之Netty百万级推送服务设计要点(转)

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务