`
wb284551926
  • 浏览: 552888 次
文章分类
社区版块
存档分类
最新评论

socket.io学习笔记二(转载)

 
阅读更多

服务器信息传输

// send to current request socket client
socket.emit('message', "this is a test");

// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");

// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');

// sending to all clients, include sender
io.sockets.emit('message', "this is a test");

// sending to all clients in 'game' room(channel), include sender
io.sockets.in('game').emit('message', 'cool game');

// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');

上述集中方式为socket.io常用的数据传输方式,

io.sockets.on('connection', function (socket) {

});

回调函数的socket参数为一个client与服务器的连接标示,不同的client会有不同的连接标示。

不分组,数据传输

  • socket.emit
    socket.emit信息传输对象为当前socket对应的client,各个client socket相互不影响。

  • socket.broadcast.emit
    socket.broadcast.emit信息传输对象为所有client,排除当前socket对应的client

  • io.sockets.emit
    信息传输对象为所有client

分组数据传输

类似于之前提过的of方法生成命名空间来管理用户,socket.io可以使用分组方法,socket.join(),以及与之对应的socket.leave()

io.sockets.on('connection', function (socket) {
    socket.on('firefox', function (data) {
        socket.join('firefox');
    });
    socket.on('chrome',function(data){
        socket.join('chrome');
    });
});

假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作

socket.emit('firefox'),就可以加入firefox聊天室;
socket.emit('chrome'),就可以加入chrome聊天室;

向一个分组传输消息,有两种方式:

socket.broadcast.to('chrome').emit('event_name', data);
  //emit to 'room' except this socket client
io.sockets.in('chrome').emit('event_name', data)
  //emit to all socket client in the room

broadcast方法允许当前socket client不在该分组内。

可能有一个疑问,一个socket是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“,socket.join()添加进去就可以了。官方提供了订阅模式的示例:

socket.on('subscribe', function(data) { 
    socket.join(data.room);
})

socket.on('unsubscribe', function(data) { 
    socket.leave(data.room);
 })

后台处理订阅/退订事件

socket = io.connect('http://127.0.0.1:1338/');
socket.emit('subscribe',{"room" : "chrome"};
socket.emit('unsubscribe',{"room" : "chrome"};

前端触发订阅/退订事件,就可以加入对应的聊天室。 通过of方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。

Socket.io难点大放送(暂时没有搞定)

  • 授权验证
    socket连接需要添加权限验证,让已登录的用户socket连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:
io.sockets.authorization(function (handshakeData, callback) {
     callback(null, true);
}).

callback函数有两个参数,第一个为error,第二个参数为是否授权bool值,通过授权回调函数应为callback(null,true),其它情况下都为拒绝建立连接。

按照web的开发方式,检测是否登录首选cookie-session来实现,问题也是出在这里。websocket握手阶段属于HTTP协议,简单来说是可以读到cookie,就可以实现session。

  • 精准单用户推送
    理论上来说
// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');

就可以向一个特定用户推送消息,但是如何获得这个socketId,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。

由于我将Express框架和socket.io库两个进程,而且没有使用redis共享数据,所以暂时不能做到session读取,大概5天后补上。

 
原文地址:http://segmentfault.com/blog/bornkiller/1190000000438604
分享到:
评论

相关推荐

    node.js + socket.io 实现点对点随机匹配聊天

    真心佩服那些可以经常发布笔记的人,其实我也想经常发来的,奈何技术不够加上懒,要向大神们多多学习了,前段时间有用bomb平台自带的socket写一个聊天室,其实基本就是改了改它的demo,这次想实现一个随机私聊,所以...

    Socket网络编程学习笔记

    在本学习笔记中,我们将深入探讨Socket编程的基本概念、原理以及如何在实际项目中应用。 首先,Socket是网络通信的接口,它提供了一种标准的方式让应用程序能够发送和接收数据。在TCP/IP协议栈中,Socket扮演着...

    Up and Running with Node.js学习笔记

    ### Up and Running with Node.js 学习笔记 #### 在线学习了“up and running with Node.js”,做了一些笔记,适合入门。 **Node.js** 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它使得开发人员能够在...

    Android笔记:Socket客户端收发数据

    在Android开发中,Socket通信是实现设备间数据传输的重要手段,尤其在构建网络服务和进行设备间的实时交互时。...通过不断实践和学习,你可以更熟练地运用Socket通信技术,为你的Android应用构建稳定、高效的网络功能。

    java io流学习笔记1

    本篇学习笔记主要聚焦于Java IO流的基本概念、分类、使用方法以及在实际开发中的应用。 一、Java IO流简介 Java IO流分为字符流和字节流两大类,它们都继承自抽象基类`java.io.InputStream`和`java.io.OutputStream...

    socketchat:基于 node js 和 socket io 的网络聊天

    总结,"socketchat"项目展示了如何使用Node.js和Socket.IO构建一个简单的网络聊天应用,通过这个项目,开发者可以学习到实时通信的基本原理,以及如何在Node.js环境中开发和管理服务器。同时,也可以了解到客户端...

    IO-黑马程序员Java学习笔记.rar

    "IO-黑马程序员Java学习笔记"这个压缩包包含了关于Java IO的详细教程,可以帮助我们深入理解这个关键领域。下面将根据提供的文件名来解析可能包含的知识点。 1. **IO.md**: 这个文件很可能是Markdown格式的学习...

    Nodejs开发的学习笔记.rar

    15. Socket.IO:介绍Socket.IO库,它是实现WebSocket功能的跨平台解决方案。 七、性能优化 16. 性能监控:如何使用工具如New Relic、PM2等对Node.js应用进行性能监控和调优。 17. Clustering:利用Node.js的集群...

    非常详细javaSE学习笔记.rar

    这份“非常详细JavaSE学习笔记.rar”压缩包显然是一份全面的Java SE学习资源,包含了从基础知识到高级特性的全方位讲解。下面,我们将详细探讨这份笔记可能涵盖的关键知识点。 1. **Java起源与环境搭建**:笔记可能...

    前端学习笔记-Node.js

    3. **Socket.IO**:学习使用Socket.IO库实现实时通信,适应各种网络环境。 **文件系统操作** 1. **读写文件**:掌握读取、写入、追加文件,以及文件路径处理技巧。 2. **目录操作**:了解创建、删除、遍历目录的...

    1.5Java聊天室的设计与实现socket.zip

    Java聊天室的设计与实现主要基于Socket编程,是Java开发领域中的一个典型实例,适用于学习和研究。这个毕业设计项目提供了完整的源代码,帮助学生或开发者深入理解网络通信和多线程编程。以下将详细讲解该项目涉及的...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    EJB工作原理学习笔记

    ### EJB工作原理学习笔记 #### RMI工作原理 RMI(Remote Method Invocation)是一种用于在不同的Java虚拟机(JVMs)之间进行远程过程调用的技术。它允许开发者创建分布式应用程序,这些应用程序可以在网络的不同部分...

    Node基础学习笔记.rar

    本压缩包"Node基础学习笔记.rar"包含了Node.js的基础知识、模块化机制、请求与响应的处理、mongoDB数据库的使用以及Express框架和WebSocket编程的相关内容,是学习Node.js的宝贵资料。 一、Node.js基础 Node.js的...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    realtime-markdown:node.js中的实时Markdown编辑器

    4. **Socket.IO**:为了实现实时通信,我们需要一个能处理双向通信的库,Socket.IO就是这样一个解决方案。它允许前端和后端之间实时、双向地交换数据,非常适合实时Markdown编辑器的需求。 5. **前端技术**:项目...

    良葛格JAVA 学习笔记

    《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...

    Nodejs学习笔记大全.pdf

    Web应用中,WebSocket和socket.io可以用于实现长连接,以支持服务器与客户端之间的实时通信。身份验证机制也是Web应用中非常重要的部分,可以采用Cookie配合Session或JWT(JSON Web Tokens)来实现用户身份验证和...

    了不起的node.js读书笔记之例程分析

    6. **Chat应用与Socket.IO**:Socket.IO是针对实时应用的库,它在WebSocket基础上提供了一层抽象,解决了WebSocket的一些兼容性和可靠性问题。通过Socket.IO,我们可以轻松实现聊天室和DJ功能,通过`socket.emit`...

Global site tag (gtag.js) - Google Analytics