需求分析

1、兼容不支持WebSocket的低版本浏览器。

2、允许客户端有相同的用户名。

3、进入聊天室后可以看到当前在线的用户和在线人数。

4、用户上线或退出,所有在线的客户端应该实时更新。

5、用户发送消息,所有客户端实时收取。

需要软件

Node.js 可以去官网下载链接:http://www.nodejs.org/download/

安装注意

安装时默认选择安装目录或者你也可以自定义安装目录这个不重要.

是否已成功安装

开始键+R 打开运行窗口输入cmd, 在里面输入node 会有提示版本号如下图:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java

这时证明程序已经成功安装.

接下来我们开始搭建环境

1. 在你的网站根目录www下新建一个文件夹命名为node, 在里面新建一个名为 package.json的文件,内容如下:

{

  "name": "realtime-server",

  "version": "0.0.1",

  "description": "my first realtime server",

  "dependencies": {}

}

如图:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_02


保存后关闭.

2. 接下来使用npm命令安装expresssocket.io. 首先在运行窗口进入到上一步创建的node文件夹中(不进入node文件夹就直接输入下面的代码会将expresssocket.io安装到一个未知的位置这个并不是我们想要的)并在运行处输入以下代码:

npm install --save express

npm install --save socket.io

如图:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_03

都是产生一堆的错误也不用管.  你要管也行自行网上找答案我这里就不说了.

好了两句代码敲完执行完你会发现你的node文件夹下有一个node_modules文件夹:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_04 

这个就表明你已经安装成功服务器已经搭建好了.

3. 编写服务器端代码.

node文件夹里面创建一个index.js文件内容为:

var app = require('express')();

var http = require('http').Server(app);

var io = require('socket.io')(http);

app.get('/', function(req, res){

res.send('<h1>Welcome to Websocket World!</h1>');

});

http.listen(3000, function(){

console.log('listening on *:3000');

});

其中3000是端口号如果你的3000端口号被占用了那么换一个.

 使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_05

然后在黑框框中输入node index.js会出现以下如图:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_06

那么就表示服务已经开启成功正在监控3000端口,  还是那句话注意路径不要被无关的细节影响了整个实验的进行.

接着在浏览器中输入127.0.0.1:3000

 

好了, 服务器的开启测试完成.

接下来开始做在线聊天系统

1. 将刚才写的index.js文件的内容替换成以下内容:

var app = require('express')();

var http = require('http').Server(app);

var io = require('socket.io')(http);

app.get('/', function(req, res){

res.send('<h1>Welcome to Websocket World!</h1>');

});

 

//在线用户

var onlineUsers = {};

//当前在线人数

var onlineCount = 0;

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

console.log('a user connected');


//监听新用户加入

socket.on('login', function(obj){

//将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到

socket.name = obj.userid;


//检查在线列表,如果不在里面就加入

if(!onlineUsers.hasOwnProperty(obj.userid)) {

onlineUsers[obj.userid] = obj.username;

//在线人数+1

onlineCount++;

}


//向所有客户端广播用户加入

io.emit('login', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});

console.log(obj.username+'加入了聊天室');

});


//监听用户退出

socket.on('disconnect', function(){

//将退出的用户从在线列表中删除

if(onlineUsers.hasOwnProperty(socket.name)) {

//退出用户的信息

var obj = {userid:socket.name, username:onlineUsers[socket.name]};


//删除

delete onlineUsers[socket.name];

//在线人数-1

onlineCount--;


//向所有客户端广播用户退出

io.emit('logout', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});

console.log(obj.username+'退出了聊天室');

}

});


//监听用户发布聊天内容

socket.on('message', function(obj){

//向所有客户端广播发布的消息

io.emit('message', obj);

console.log(obj.username+'说:'+obj.content);

});

  

});

http.listen(3000, function(){

console.log('listening on *:3000');

});

以上是服务器端的代码, 回顾一下如图:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_07


2. www网站根目录下新建一个文件夹,作为客户端来访问的命名为demo, 里面有四个文件由于代码略多,我就不直接发代码了 在文最下面我会给出整个项目的源码链接下载地址!

 

3. 好了客户端的代码也是完成了的打开黑框框重新启动一下服务器:

 

4. 在浏览器中输入localhost/demo/index.html, 出现这个界面:

 

输入用户名后进入

 

Ok, 成功了想测试多人的就多开几个浏览器:

使用Node.js+Socket.IO搭建WebSocket实时在线聊天系统_java_08

至此整个实验就完成了.