服务端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服务端与客户端实现即时聊天
猜你喜欢
转载自21jhf.iteye.com/blog/2139906
今日推荐
周排行