
Nodejs开发多人聊天室(二)
欢迎回来!今天接着上次聊天室的项目继续往下说,这一期我们就讲剩下的客户端实现。
2、客户端:
同样的,和服务器端一样,在程序最开始需要添加必要的包,并定义指向标准输入流的可读流。对于客户端,只需添加socket.io客户端的包(socket.io-client)即可如下:
const io = require('socket.io-client');
const cout = process.stdout;
const cin = process.stdin;
为了使用户能够通过客户端进入聊天室,应将客户端与服务器端联通,因此我们使用connect事件来创建两者的连接。http://localhost:8080表明我们是在本地创建的服务器且端口为8080.
//Connect to server
const socket = io.connect('http://localhost:8080');
创建专门存储用户自定义名称的变量local_id,默认为未定义。
//Define user's ID var local_id = null;
下一步就是对事件的定义,由于客户端只是单独的个体,不像服务器需要处理多个用户的连接,客户端只需将用户输入的消息上传给服务器同时处理服务器下发的命令触发相应的事件即可。本项目只定义了connect、error、message、people_in、people_out五个事件。Connect事件在客户端连接上服务器时触发,在这里使用了process.argv方法返回用户自定义的名称并将其上传给服务器。
//Client connect to the server
socket.on('connect',function(){
console.log("Connected")
local_id = process.argv[2] //Pass the parameter as user's ID
socket.emit('data', {
id: local_id, //Send user's ID to server
})
});
process.argv返回用户运行脚本文件时输入的各个参数组成的数组。如下图,用户运行脚本的命令为node client.js Alex,则process.argv返回数组[node client.js Alex],代码中将process.argv[2]赋值给local_id即将local_id赋值为Alex。
C:\UserssebasDesktopwebsocket-chatroom-master>node client.js Alex
下面是error事件和message事件,error事件主要是当有错误出现时将错误内容打印在界面上。Message事件则是当聊天室内有用户发消息时由服务器触发,触发的同时服务器会向客户端发送消息的源头(哪个用户)以及消息的内容,客户端message事件被触发后会在界面上将消息打印出来。
//Error event
socket.on('error', function(event){
console.log(event)
});
//Message event
socket.on('message', function(msg){
console.log(msg.source_id + ': ' + msg.message);
});
People_in和people_out两个事件是在有用户进入或退出聊天室时触发,退出时显示谁退出了聊天室,进入时则显示在线人数。
//People left the chatroom
socket.on('people_out', function(data){
console.log(data.id + ' is left.')
});
//People join the chatroom
socket.on('people_in', function(data){
console.log('There is ' + data.cnt + ' people online.')
});
最后一步和服务器端类似,标准输入的获取。
//Collect user's input string
cin.on('data', function(chunk){
if(chunk.toString() != '
'){
msg = (chunk+'').replace(/[
]/ig,"");
//If the string is 'exit' or 'quit' then disconnect from the server
if(msg.toLowerCase() == 'exit' || msg.toLowerCase() == 'quit'){
console.log("You have disconnected from the server.")
socket.disconnect();
}else{
//Otherwise send the string and the user ID to the server
socket.emit('message',{
message: msg,
id: local_id,
});
}
}
});
程序效果图:
服务器端界面1
客户端界面1
客户端界面2
客户端界面3
服务器端界面2
后记:
文章写到项目已经全部介绍完了,这是我刚学Nodejs时拿来练手的小项目,当时也弄了挺久的,整个程序其实很简单,功能也比较少,很有很多拓展的空间,有兴趣的小伙伴也可以继续挖下去。网上其实也有很多类似的程序,有些还在浏览器上做出了界面,整体也会大众一些。不管怎样,这只是一个入门,上升的空间非常之大。最后附上程序源码,有兴趣的小伙伴自行下载。
程序源码地址:https://github.com/Sebastian-Yang/websocket-chatroom
以上内容为作者原创,如需转载,请先联系作者,谢谢。


