如何使用node.js搭建websocket即时聊天服务器
随着了解了下node.js,到后尝试着使用node.js搭建一个网站,越来越发现node.js的强大与方便
最近突然想尝试下写一个使用node.js搭建的服务器的即时聊天安卓应用作为练习,并且写下这篇博客记录一下方便以后查阅复习,也分享分享心得,第一次写博客可能有点枯燥见谅,代码技术有点糙也欢迎大家指点。
首先是即时聊天通讯使用的协议选择,这个比较关键因为这个影响到后面功能的效果跟实现方法。我看中的是websocket,至于websocket是什么,可以看一下这个文章 Socket 与 WebSocket(https://blog.zengrong.net/post/2199.html)
websocket支持很多语言/平台,java跟node.js当然也在其中。客户端要做的就是使用java把websocket神奇地融入android开发之中,这个会在另一篇文章写安卓端的工作,如题我们把服务端的东西做好。
其实不太难,我使用的是node.js express开发框架搭建的服务器,websocket模块的跟http模块的两个不同的东西,但是写起来差不多,主体代码量不多 app.js一共才40行,因为主要我想实现的是即时聊天,用户信息存储我使用万能的第三方爸爸帮忙了,要是信息存储服务器也自己写代码量就不会这么少了。
我们话归正题,我们先要在自己的node.js里面安装websocket模块,在命令行输入如下命令:
npm install express-ws
express-ws是express的一个中间件,借助其我们可以在express中实现websocket的功能。
安装完成了可以开始码,开始请求模块代码(node.js模块请求这个特点让我感觉很强大,因为你想要的模块他都能有):
var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
app.use(express.static('./static'));
初始化用户名id数组跟相对应的websocket连接数组(当然这两个数组变量必须是全局的):
var users = new Array();
var conns = new Array();
下面可以来实现ws请求各个的方法了:
app.ws('/ws', function(ws, req) {
console.log('new connection successfully');
ws.on('message', function(msg) {
//这里是当来消息的时候执行的方法
});
ws.on('close',function(code,reason){
//这里是当连接注销的时候执行的方法
console.log('一个连接注销');
});
})
我们先来分析下客户端ws连接会发来什么消息(格式是json)
- 定时验证(定时检测连接是否稳定的信号)
- 第一次连接发送上来的用户信息(比如uid,username之类的)
- 即时聊天内容
我把这三种信息分别以简单的JSON格式传输
- {
type : “timer” ,
content : **定时验证**
} - {
type : “uid” ,
uid: “********”
} - {
type:“msg” ,
toid:“toid”,
uid:“uid”,
content:“content”,
name:“username”
}
我们先把消息主体转为JSON对象这样我容易把数据提取出来
var json = JSON.parse(msg);
我们处理先最简单的定时验证:定时验证
为什么它是最简单的因为它除了是客户端发来验证连接是否存在没有断开以外对服务端来说毫无意义,所以我们只需要把验证信息打印出来无需其他操作:
if(json.type == "timer"){
console.log(json.content);
}
然后我们来处理小BOSS:第一次连接发送上来的用户信息(比如uid,username之类的)
它是代表这个客户端第一次连接到服务器,所以我们要把它的这个连接保存起来并且跟uid关联起来,因为方便我们找到它给它发消息,代码如下:
else if (json.type == "uid"){
conns.push(ws);
users.push(json.uid);
console.log("当前ws连接加入数组成功 关联uid :"+json.uid);
}
大BOSS,聊天内容:
处理它我们需要知道它是谁发的,给谁,内容有什么,解析出来后,在已存在的ws连接中找到接受者把json消息发过去就完事了,逻辑理清晰了,代码如下:
else{
console.log(json.content);
for (var i = conns.length - 1; i >= 0; i--) {
if(users[i] == json.toid){
conns[i].send('{"uid" : "'+json.uid+'","toid":"'+json.toid+'","name":"'+json.name+'" , "content":"'+json.content+'"}');
break;
}
}
}
这样我们的消息处理就完成了。
下一步当连接消失的时候我们要做的是把当前关闭的连接找出来,在数组里面移除,代码如下:
ws.on('close',function(code,reason){
for (var i = conns.length - 1; i >= 0; i--) {
if(conns[i] === ws){
conns.splice(i,1);
users.splice(i,1);
break;
}
};
console.log('服务器注销连接');
});
好了,这样我们的ws简易的即时聊天后台算是实现好了,最后一步设置监听端口(不一定是8000,要是被占用的换个端口也可以),export:
app.listen(8000);
module.exports = app;
就这样一个具有简易功能的基于node.js+express搭建的即时聊天服务器写好了。
由于是挺久之前做的东西截图找不到了,附上完整代码资源吧(请笑纳)
下篇会记下android即时聊天要怎么实现,质量估计跟这篇差不多,不要有所期待,不定期更新(笑)