用网络模块实现多人命令行聊天室的Node.js方法
本文介绍了Node.js使用Net模块实现命令行多人聊天室。下面就不多说了。我们来看看详细的介绍。
1.网络模块的基本应用编程接口
要使用Node.js的net模块实现命令行聊天室,首先要了解NET模块的API用法。那个。NET模块API分为两类:
服务器和套接字类,工厂方法。
服务器类如下图所示:
网。服务器类可用于创建继承事件发射器的TCP或本地服务器。
套接字类如下:
网。套接字类通常用于创建套接字客户端或网络参数。服务器连接事件。
出厂方法如下:
以上三个图展示了API的使用。NET模块的内部原理其实和C网络编程的原理差不多,就是下面的步骤。
服务器端:
创建套接字套接字绑定IP和端口开始侦听等待客户端连接与客户端通信关闭套接字客户端:
创建一个套接字套接字来连接服务器服务器以与服务器通信,并关闭套接字,如下图所示:
2.聊天室的设计与实现
我学习了上面NET模块API的使用,然后开始实现命令行聊天室。我们不需要做任何复杂的事情,只需要实现以下功能:
用户定义的昵称,不能更改。当新用户进入聊天室,或者用户离开聊天室,向其他用户广播发送信息时,需要向其他用户广播。客户端和服务器建立心跳机制。用户可以通过输入“退出”或“退出”退出聊天室确定功能,然后开始编写代码。这里我就不一步一步分析了,直接进入代码。首先是服务器:
服务器:
const net=require(' net ');const server=net。CreateServer();const clients={ };//保存客户端的连接定义变量客户端=null/当前客户连接var uid=0;server.on('connection ',(socket)={ //启动心跳机制var isOnline=!0;var keepAliveTimer=套接字。timer=setInterval(()={ if(!等值线){等值线=!1;客户端=套接字退出(插座。尼克);返回;} if(socket。write){ socket。write(' : ');} else {客户端=套接字退出(插座。尼克);} },3000);socket.on('end ',()={ console。日志(`客户端已断开连接.\ n \ r `);插座。销毁();});socket.on('error ',(error)={ console。日志(错误。消息);});socket.on('data ',(chunk)={ client=socket;var msg=JSON。解析(块。ToString());if(msg。cmd==' keep '){ isoline=!0;返回;} DeALMSG(msg);});});server.on('error ',(err)={ console。日志(err);});服务器. on('侦听,()={ console . log(` 0侦听${server.address().address}:${server.address().端口} \ n \ r `);});服务器。听(8060);//启动监听/** * 处理用户信息*/function DeloMSg(msg){ const cmd=msg。cmdconst funs={ 'login':login,' chat':chat,' quit':quit,' exit ' : quit };if(funs[cmd]的类型!=='函数')返回!1;funs[cmd](msg);}/** * 释放连接资源*/function FreeConn(conn){ conn . end();删除客户端[conn . uuid];conn . timerclineinterval(conn . timer);}/** * 用户首次进入聊天室*/函数登录(msg){ var uuid=' ';uuid=GetRNdstr(15)(uid);//产生用户客户端标识。写入(` 0欢迎你,${msg.nick}:这里总共有$ { Object.keys(客户端)。长度}个小伙伴在聊天\ r \ n `)客户端。尼克=味精。尼克;client . uuid=uuid clients[uuid]=client;广播(` 0系统:${msg.nick}进入了聊天室.`);}/** * 广播消息*/函数广播(消息){对象.键(客户端)。forEach((uuid)={ if((clients[uuid]!=客户端)客户端[uuid].可写){ clients[uuid].写(味精);} });}/** * 退出聊天室*/函数退出(尼克){ var message=` 0小伙伴${nick}退出了聊天室.`;广播(消息);自由连接(客户端);}功能聊天(味精){ if(味精。味精。tolowercase()==' quit ' | | msg。味精。tolowercase()==' exit '){ quit(msg。尼克);返回;} var message=`${msg.nick}说:$ { msg。msg } `;广播(消息);} /** * 随机指定长度(镜头)的字符串*/function getRndStr(len=1){ var rndStr=' ';for(;长度透镜;rndStr=Math.random().toString(36).substr(2));返回rndStr.substr(0,len);}客户端代码如下:
client:
const net=require(' net ');const cout=process . stdoutconst CIN=process。stdin定义变量客户端=nullvar nick=cout。写入(` 0请输入昵称:`);//监听命令行输入cin.on('data ',(chunk)={ if(chunk.toString()!=' \ r \ n '){ if(client===null){ nick=(chunk ' ').替换(/[\ r \ n]/ig ' ');创建客户端();}else{ msg=(chunk ' ').替换(/[\ r \ n]/ig ' ');客户。write(JSON。stringify({ cmd : ' chat ',msg: msg,nick : nick });//如果输入是出口或放弃则断开连接并退出if(msg。tolowercase()==' exit ' | | msg。tolowercase()=' quit '){ client。end();CIN。end();返回;} cout。写入(` 0你说:$ { msg } \ n \ r `);} } else { cout。写入(` 0请输入昵称:`);}});函数addListener(客户端){ client。on(' connect ',()={ cout。写入(` 0已连接到服务器\ n \ r `);客户。write(JSON。stringify({ cmd : ' log in ',msg: 'hello server ',nick : nick });});client.on('end ',(chunk)={ cout.write('与服务器断开连接\ n \ r `);});client.on('data ',(chunk)={ //如果是心跳信息则回应保持命令if(chunk。tostring()==' : '){ client。write(JSON。stringify({ cmd : ' keep ',msg: ' ',nick : nick });返回;} cout。write(`$ { chunk } \ n \ r `);});client.on('error ',(err)={ cout.write('出现错误\ n \ r $ { err } `);});}/** * 创建窝并连接服务器*/函数create client(){ console。日志(' \ 033[2J]);//清屏操作科特。写入(` 0输入"退出或退出"退出聊天室\ r \ n `);客户端=新网络套接字()客户端。连接({端口:8060/*,主机: ' 1。1 .1 .69 ' */});addListener(客户端);}执行结果如下如下:
到此,一个命令行聊天室便做完了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
版权声明:用网络模块实现多人命令行聊天室的Node.js方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。