全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Node.js利用Net模块实现多人命令行聊天室的方法

这篇文章介绍的是Node.js利用Net模块实现命令行式的多人聊天室,下面话不多说,来看看详细的介绍吧。

1、net模块基本API

要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用。NET模块API分为两大类:

Server和Socket类、工厂方法。

Server类如下图所示:

net.Server类可以用来创建一个TCP或本地服务器,继承了EventEmitter。

Socket类如下:


net.Socket类一般用创建一个socket客户端或者是net.Server connection事件的参数。

工厂方法如下:

以上三个图展示了API的使用,其实NET模块的内部原理和C++网络编程差不多的,都是以下步骤。

服务端:

  1. 创建socket套接字
  2. 绑定IP和端口
  3. 启动监听
  4. 等待客户端连接
  5. 与客户端进行通信
  6. 关闭socket

客户端:

  1. 创建socket套接字
  2. 连接server服务器
  3. 与服务器进行通信
  4. 关闭socket

如下图所示:

2、聊天室的设计和实现

上面学习了NET模块API的使用,接下来便开始实现命令行聊天室,我们不需要做的很复杂,只需实现如下功能即可:

  1. 用户自定义昵称,不可更改
  2. 当有新的用户进入聊天室,或者用户离开聊天室,广播给其他用户
  3. 用户发送信息,需广播给其他用户
  4. 客户端与服务端建立心跳机制
  5. 用户输入'exit'或者'quit'可以退出聊天室

确定功能之后,便开始代码的编写。这里我就不一步步分析,直接上代码了,首先是服务端:

Server:

const net = require('net');
const server = net.createServer();
const clients = {};//保存客户端的连接
var client = null;//当前客户连接
var uid = 0;
server.on('connection',(socket)=>{
 //启动心跳机制
 var isOnline = !0;
 var keepAliveTimer = socket.timer = setInterval(()=>{
  if(!isOnline){
   isOnline = !1;
   client = socket;
   quit(socket.nick);
   return;
  }
  if(socket.writable){
   socket.write('::');
  }else{
   client = socket;
   quit(socket.nick);
  }
 },3000);
 socket.on('end',()=>{
  console.log(`client disconnected.\n\r`);
  socket.destroy();
 });
 socket.on('error',(error)=>{
  console.log(error.message);
 });
 socket.on('data',(chunk)=>{
  client = socket;
  var msg = JSON.parse(chunk.toString());
  if(msg.cmd=='keep'){
   isOnline = !0;
   return;
  }
  dealMsg(msg);
 });
});
server.on('error',(err)=>{
 console.log(err);
});
server.on('listening',()=>{
 console.log(`listening on ${server.address().address}:${server.address().port}\n\r`);
});
server.listen(8060);//启动监听
/**
 * 处理用户信息
 */
function dealMsg(msg){
 const cmd = msg.cmd;
 const funs = {
  'login':login,
  'chat':chat,
  'quit':quit,
  'exit':quit
 };
 if(typeof funs[cmd] !== 'function') return !1;
 funs[cmd](msg);
}
/**
 * 释放连接资源
 */
function freeConn(conn){
 conn.end();
 delete clients[conn.uuid];
 conn.timer&&clearInterval(conn.timer);
}
/**
 * 用户首次进入聊天室
 */
function login(msg){
 var uuid = '';
 uuid = getRndStr(15)+(++uid);//产生用户ID
 client.write(`欢迎你,${msg.nick}:这里总共有${Object.keys(clients).length}个小伙伴在聊天.\r\n`)
 client.nick = msg.nick;
 client.uuid = uuid;
 clients[uuid] = client;
 broadcast(`系统:${msg.nick}进入了聊天室.`);

}
/**
 * 广播消息
 */
function broadcast(msg){
 Object.keys(clients).forEach((uuid)=>{
  if((clients[uuid]!=client)& clients[uuid].writable){
   clients[uuid].write(msg);
  }
 });
}
/**
 * 退出聊天室
 */
function quit(nick){
 var message = `小伙伴${nick}退出了聊天室.`;
 broadcast(message);
 freeConn(client);
}

function chat(msg){
 if(msg.msg.toLowerCase()=='quit'||msg.msg.toLowerCase()=='exit'){
  quit(msg.nick);
  return ;
 }
 var message = `${msg.nick}说:${msg.msg}`;
 broadcast(message);
} 
/**
 * 随机指定长度(len)的字符串
 */
function getRndStr(len=1){
 var rndStr = '';
 for (; rndStr.length < len; rndStr += Math.random().toString(36).substr(2));
 return rndStr.substr(0, len);
}

客户端代码如下:

client:

const net = require('net');
const cout = process.stdout;
const cin = process.stdin;

var client = null;
var nick = '';

cout.write(`请输入昵称:`);
//监听命令行输入
cin.on('data',(chunk)=>{
 if(chunk.toString()!='\r\n'){
  if(client === null){
   nick = (chunk+'').replace(/[\r\n]/ig,"");
   createClient();
  }else{
   msg = (chunk+'').replace(/[\r\n]/ig,"");
   client.write(JSON.stringify({
    cmd: 'chat',
    msg: msg,
    nick: nick
   }));
   //如果输入是exit或quit则断开连接并退出
   if(msg.toLowerCase() == 'exit' || msg.toLowerCase() == 'quit'){
    client.end();
    cin.end();
    return;
   }
   cout.write(`你说:${msg}\n\r`);
  }
 }else{
  cout.write(`请输入昵称:`);
 }
});

function addListener(client) {
 client.on('connect', () => {
  cout.write(`已连接到服务器\n\r`);
  client.write(JSON.stringify({
   cmd: 'login',
   msg: 'hello server',
   nick: nick
  }));
 });
 client.on('end', (chunk) => {
  cout.write(`与服务器断开连接.\n\r`);
 });
 client.on('data', (chunk) => {
  //如果是心跳信息则回应keep命令
  if(chunk.toString()=='::'){
   client.write(JSON.stringify({
    cmd: 'keep',
    msg: '',
    nick: nick
   }));
   return ;
  }
  cout.write(`${chunk}\n\r`);
 });
 client.on('error', (err) => {
  cout.write(`an error has occured.\n\r${err}`);
 });
}
/**
 * 创建socket并连接服务器
 */
function createClient(){
 console.log('\033[2J');//清屏操作
 cout.write(`输入'EXIT OR QUIT'退出聊天室.\r\n`);
 client = new net.Socket()
 client.connect({port:8060/*,host:'1.1.1.69'*/});
 addListener(client);
}

执行结果如下如下:

到此,一个命令行聊天室便做完了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# nodejs聊天室  # nodejs多人聊天室  # nodejs实现聊天室  # Node.js API详解之 net模块实例分析  # node.js使用net模块创建服务器和客户端示例【基于TCP协议】  # Node.js net模块功能及事件监听用法分析  # Node.js net模块的使用示例  # 聊天室  # 客户端  # 命令行  # 服务端  # 请输入  # 所示  # 这篇文章  # 创建一个  # 如下图  # 的是  # 都是  # 小伙伴  # 我就  # 出了  # 首次  # 你说  # 只需  # 要做  # 或者是  # 来看看 


相关文章: 哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  济南专业网站制作公司,济南信息工程学校怎么样?  安徽网站建设与外贸建站服务专业定制方案  已有域名和空间,如何快速搭建网站?  Swift中switch语句区间和元组模式匹配  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  宝塔Windows建站如何避免显示默认IIS页面?  如何通过虚拟主机快速搭建个人网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在IIS中配置站点IP、端口及主机头?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  教学论文网站制作软件有哪些,写论文用什么软件 ?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何通过FTP服务器快速搭建网站?  c# await 一个已经完成的Task会发生什么  如何在服务器上三步完成建站并提升流量?  C#如何在一个XML文件中查找并替换文本内容  建站之星如何优化SEO以实现高效排名?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站之星微信建站一键生成小程序+多端营销系统  简单实现Android验证码  如何通过IIS搭建网站并配置访问权限?  济南企业网站制作公司,济南社保单位网上缴费步骤?  贸易公司网站制作流程,出口贸易网站设计怎么做?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  建站之星代理商如何保障技术支持与售后服务?  h5网站制作工具有哪些,h5页面制作工具有哪些?  长沙做网站要多少钱,长沙国安网络怎么样?  高性价比服务器租赁——企业级配置与24小时运维服务  建站主机功能解析:服务器选择与快速搭建指南  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何通过商城自助建站源码实现零基础高效建站?  如何在IIS7上新建站点并设置安全权限?  如何在万网ECS上快速搭建专属网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  定制建站模板如何实现SEO优化与智能系统配置?18字教程  大连网站设计制作招聘信息,大连投诉网站有哪些?  网站制作壁纸教程视频,电脑壁纸网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何在腾讯云免费申请建站?  如何挑选高效建站主机与优质域名?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  ,制作一个手机app网站要多少钱?  微信h5制作网站有哪些,免费微信H5页面制作工具?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。