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

Socket.io 学习笔记三(转载)

 
阅读更多

前言

上次说到关于socket连接授权的问题,有好心人提示说到session-socket开源项目,可以在建立连接后进行session相关操作, 操作挺方便,很感谢这位朋友。我的目的是在握手阶段,通过会话判定权限,暨是否建立连接,所以只能自己查阅中间件代码,然后COPY需要的。

Connect Session

Connect相关的会话存储我知道四种,cookie-based,memory-store,redis,mongodb.

  • cookie-based方案数据直接存储在cookie里面,解析之后即可获得。

  • memory-store方案,使用内存做容器,来存储数据,由于中间件使用了闭包特性,如果不对中间件动手脚的话,是无法访问这些数据,而且我是Express和socket.io分离的,更不可能拿到数据,所以此路不通。

  • connect-redis方案,将数据放入redis数据库,这样不同进程都可以获取到session数据。Cookie解析之后获取sessionId,通过sessionId从redis获取数据。

  • mongodb方案,跟redis机理相同,不再赘述。

Connect-redis

  • 启用connect-redis session。
var express =require('express');
var app = express();
var RedisStore = require('connect-redis')(express);
app.use(express.cookieParser('love'));
app.use(express.session({key: 'lovestory', secret: 'lovestory',
    store: new RedisStore({ host: '127.0.0.1', port: 6379})
}));
  • socket.io部分
var io = require('socket.io').listen(1338);
var utils = require('connect/lib/utils.js');
var cookie = require('connect/node_modules/cookie-parser/node_modules/cookie');
var redis = require('redis');
var client = redis.createClient(6379,'127.0.0.1');
//连接授权判定,相关参数需要跟启用Session的参数相同
io.sockets.authorization(function (handshakeData, callback) {
    //cookie解析,获取sessionId
    var cookies = handshakeData.headers.cookie;
    var secret = 'lovestory';
    var key  = 'lovestory';
    var prefix = 'sess:';
    var sessionId = null;
    if (cookies) {
        cookies = cookie.parse(cookies);
        cookies = utils.parseSignedCookies(cookies, secret);
        cookies = utils.parseJSONCookies(cookies);
        if(cookies[key]) {
            sessionId = cookies[key];
        }
      }
   //从redis获取数据
    var sid = prefix + sessionId;
    client.get(sid,function(err,data){
        var result = JSON.parse(data);
        if (result.user){
            for (var i in handshakeData) {
                delete handshakeData[i];
            }
            handshakeData.user = result.user;
            callback(null,true);
        }else{
            callback(null,false);
        }
    });
});
//存储user,socketId键值对,需要单点推送的时候通过user获取对应的socketId即可。 
io.sockets.on('connection', function (socket) {
    client.set(socket.handshake.user,socket.id);
    io.sockets.socket(socket.id).send('Do you love this girl!!!');
});

Cookie-based更加简单一些

  • Express部分
var express =require('express');
var app = express();
app.use(express.cookieParser('lovestory'));
app.use(express.cookieSession({key: 'lovestory', secret : 'lovestory'});
  • socket.io部分
var io = require('socket.io').listen(1338);
var utils = require('connect/lib/utils.js');
var cookie = require('connect/node_modules/cookie-parser/node_modules/cookie');
//连接授权判定,相关参数需要跟启用Session的参数相同
io.sockets.authorization(function (handshakeData, callback) {
    //cookie解析,获取cookie中的session数据
    var cookies = handshakeData.headers.cookie;
    var secret = 'lovestory';
    var key  = 'lovestory';
    if (cookies) {
        cookies = cookie.parse(cookies);
        cookies = utils.parseSignedCookies(cookies, secret);
        cookies = utils.parseJSONCookies(cookies);
        if(cookies[key]) {
            session = JSON.parse(cookies[key]);
        }
      }
});

问题引申

上述代码比较原始,因为基本上是COPY出来的,不过可以实现我最初的想法。但是新问题也冒出来了,我如何得知,什么时候,需要向哪些用户,推送什 么消息。例如SNS,一位用户更新了状态,需要推送给他的朋友,就是需要主动向浏览器端推送消息的时候,如何通知到这个进程。。。。。。。

粗略构想(“进程”只为叙述方便,略有不妥)

  • Websocket握手阶段是通过HTTP协议完成的,socket.io负责监听upgrade,connection事件,可以与普通 HTTP server共存。通过HTTP模块监听普通http请求,当业务逻辑进程完成相应工作,判定需要向其他用户推送消息时,向推送进程发出http请求,附 带需推送内容即可。

  • 业务逻辑进程与推送进程建立socket连接,当业务逻辑进程完成相应工作,判定需要向其他用户推送消息时,通过socket发送消息即可。

简易实现

  • socket.io与普通HTTP服务同时存在
var http = require('http');
var app = http.createServer(function(req,res){});
var io = require('socket.io').listen(app);
app.listen(1338);
  • HTTP请求body部分目测需要包含以下信息。

    字段 功能
    type 必需。single,room,或all,对应单点推送,群组推送,全局推送
    pointer 必需。指明需要推送的目标,若typeall,显式声明true
    content 必需。指明需要推送的内容
  • 事件监听函数(请原谅我的大嵌套~~|||)

function(req,res){
    jsonBody(req,res,function(err,data){
        if(err) {
            res.statusCode = 400;
            res.end('Bad request, json body only');
        }else{
           if (data.type && data.pointer && data.content) {
               switch (data.type) {
                   case 'all' :
                     io.sockets.send(data.content);
                     res.end('success');
                     break;
                   case 'room' :
                     io.sockets.in(data.pointer).send(data.content);
                     res.end('success');
                     break;
                   case 'single' :
                     client.get(data.pointer, function(err,result){
                         if(result) {
                             io.sockets.socket(result).send(data.content);
                             res.end('success');
                         }
                     })
                   default :
                     res.end('unexpected type');
                     break;
               }
           }else{
               res.end('Bad request!');
           }
        }
    })
}

代码还欠缺很多打磨,不过基本功能已经出来了。

  • 关于服务器间socket连接,基本理念是相同的,就不再往坑里跳。

个人总结

到此为止,socket.io常规使用已经全部over,涉及到的相关代码私下继续打磨。

原文地址:http://segmentfault.com/blog/bornkiller/1190000000449888

分享到:
评论

相关推荐

    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. **目录操作**:了解创建、删除、遍历目录的...

    Java 学习笔记Java学习笔记

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

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

    Java聊天室的设计与实现主要基于Socket编程,是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