当前位置:首页 > 开发 > 移动开发 > 正文

使用Nodejs做websocket服务端与客户端实现即时聊天

发表于: 2014-10-14   作者:21jhf   来源:转载   浏览:
摘要: 服务端nodejs:/** * Created by jhf on 14-10-13. */ var cons = new Array(); var userArray = new Array(); var WebSocketServer = require('ws').Server,     wss = new WebSocketServer({po
服务端nodejs:/**
* Created by jhf on 14-10-13.
*/
var cons = new Array();
var userArray = new Array();
var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({port:8080});

wss.on('connection',function(ws){
    //从头中取出客户端标示userid,当然也可以得到客户端的ip地址
    var userId = ws.upgradeReq.headers['userid'];
    console.log('new connection successfully userId:'+userId);
    cons.push(ws);
    userArray.push(userId);
    ws.on('message',function(message){
        console.log(message);
        for (var i=0; i<cons.length;i++) {
            //判断userid是否为toUserId(发给指定的客户端)
            var msgObj = JSON.parse(message);
            if (userArray[i] == msgObj.toUserId) {
                cons[i].send(message);
                break;
            }
        }
    });
    ws.on('close',function(){
        for (var i=0;i<cons.length;i++){
            if (cons[i]==ws)cons.splice(i,1);
        }
    });
});

console.log('websocket-server running...');

客户端nodejs:
/**
* Created by jhf on 14-10-13.
*/
var WebSocket = require('ws')
    ,Options = require('options');

var options = new Options({"headers":{}});
options = {
    "headers":{"userid":"abc"}
};
var ws = new WebSocket('ws://127.0.0.1:8080',options);

ws.on('open',function(ss){
    var obj = {
        "toUserIconUrl": "/api/getPicture/53c9e22cce37989659b24852",
        "toUserName": "Fred",
        "toUserId": "54237cb58c29a38f44362082",
        "content": "测试消息",
        "fromUserIconUrl": "/api/getPicture/53c0b7337a4dd8f77549838e",
        "fromUserName": "Jin",
        "fromUserId": "538aacd78016832f19000062",
        "contentType": "text",
        "time": (new Date()).getTime()
    };
    var str = JSON.stringify(obj);
    console.log(str);
    ws.send(str);

});
ws.on('message',function(message){
   console.log('received: %s',message);
});

基本原理:
1,客户端连接到服务端的时候在header里面加入用户标示userid,用来判断哪个客户端连接到了服务端
2,服务端从header里面获取userid,在消息体中判断需要发送给哪个客户端(toUserId与header里面相等),将客户端发来的消息发送到指定客户端(网络上都是群发聊天室的例子居多,一对一聊天的很难找到)

另外,header中的id可以加密,消息内容也可以加密后发送,header是在websocket建立socket连接之前握手的时候指定的,一些加密的协议会在握手的时候进行处理,防止非法客户端连入服务端

使用Nodejs做websocket服务端与客户端实现即时聊天

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
WebSocket,并非HTML 5独有,WebSocket是一种协议。只是在handshake的时候,发送的链接信息头和HTTP
文中案例在apache-tomcat-8.0.15和jdk1.8.0_25环境下开发,运行。不过标题上是Java7,并不造成影响,
这个源码项目是一款Dollars即时聊天客户端应用源码,源码也比较简单的,希望这个案例能够帮到大家的
这个源码项目是一款Dollars即时聊天客户端应用源码,源码也比较简单的,希望这个案例能够帮到大家的
这个源码项目是一款Dollars即时聊天客户端应用源码,源码也比较简单的,希望这个案例能够帮到大家的
  上一篇文章,我们了解了客户端如何与服务器创建WebSocket连接。但是一个巴掌拍不响,既然是通信
Netty 实现 WebSocket 聊天功能 原文同步至http://www.waylau.com/netty-websocket-chat/ 上一次我
Socket.IO为WebSockets这个较新的web技术提供了必要的支持,包含客户端与服务端模块,以便建立通信
本例实现一个简单的控制台与wp7端的聊天对话。采用多线程处理接入的客户端。代码都贴上来吧。注释写
Android手机蓝牙实现多人聊天,基本原理是一台手机蓝牙作为服务器,其他手机蓝牙作为客户端。客户端
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号