效果图

首先开启server.js 打开服务器端,然后打开client.js,注册用户。打开一个注册一个用户,打开三个,注册三个用户。

接下来,小王发布一个广播消息,小李和小刘都收到了此消息。

接下来,小李给小刘私信。格式是 小刘:*****

然后就是一番对话

然后小李发布一个广播消息

下面是具体代码

创建一个目录,chatroom。



其中,config 作为配置文件,可以不用文件后缀

config

  1. module.exports={
  2. "port":3000,
  3. "host":"127.0.0.1"
  4. }

client.js

  1. /**
  2. 终端聊天室客户端
  3. */
  4. var net = require('net');
  5. var config = require('./config');
  6. var client = net.createConnection({
  7. port:config.port,
  8. host:config.host
  9. });
  10. //用户注册成功后为该属性赋值
  11. var username;
  12. client.on('connect',function() {
  13. console.log('请输入用户名:');
  14. process.stdin.on('data',function(data){
  15. data = data.toString().trim();
  16. //判断用户是否存在
  17. if(!username) {
  18. var send = {
  19. protocal : 'signup',
  20. username : data
  21. }
  22. client.write(JSON.stringify(send));
  23. return;
  24. }
  25. //判断是广播消息还是点对点
  26. //name :内容
  27. var regex = /(.{1,18}):(.+)/;
  28. var matches = regex.exec(data);
  29. if(matches) {
  30. var from = username;
  31. var to = matches[1];
  32. var message = matches[2];
  33. var send = {
  34. protocal : 'p2p',
  35. from : username,
  36. to : to,
  37. message : message
  38. }
  39. client.write(JSON.stringify(send));
  40. }else {
  41. var send = {
  42. protocal : 'broadcast',
  43. from : username,
  44. message :data
  45. }
  46. client.write(JSON.stringify(send));
  47. }
  48. });
  49. });
  50. client.on('data',function(data){
  51. data = JSON.parse(data);
  52. switch(data.protocal) {
  53. case 'signup':
  54. var code = data.code;
  55. switch(code) {
  56. case 1000:
  57. username = data.username;
  58. console.log(data.message);
  59. break;
  60. case 1001:
  61. console.log(data.message);
  62. break;
  63. default:
  64. break;
  65. }
  66. break;
  67. case 'broadcast':
  68. console.log(data.message);
  69. break;
  70. case 'p2p':
  71. var code = data.code;
  72. switch(code){
  73. case 2000:
  74. var from = data.from;
  75. var message = data.message;
  76. message = from + '说:' + message;
  77. console.log(message);
  78. break;
  79. case 2001:
  80. console.log(data.message);
  81. break;
  82. default:
  83. break;
  84. }
  85. break;
  86. default:
  87. break;
  88. };
  89. });

server.js

  1. /**
  2. 终端聊天室服务器端
  3. */
  4. var net = require('net');
  5. var config = require('./config');
  6. var broadcast = require('./broadcast.js');
  7. var p2p = require('./p2p.js');
  8. var signup = require('./signup.js');
  9. var server = net.createServer();
  10. var users = {};
  11. server.on('connection',function(socket) {
  12. socket.on('data',function(data) {
  13. //解析客户端发送的数据
  14. data = JSON.parse(data);
  15. //根据客户端发送的数据类型,做相应的操作
  16. switch(data.protocal) {
  17. //用户注册
  18. case 'signup':
  19. signup.signup(socket,data,users);
  20. break;
  21. //广播消息
  22. case 'broadcast':
  23. broadcast.broadcast(data,users);
  24. break;
  25. //点对点消息
  26. case 'p2p':
  27. p2p.p2p(socket,data,users);
  28. break;
  29. //异常
  30. default:
  31. break;
  32. }
  33. });
  34. socket.on('error',function(){
  35. console.log('有客户端异常退出了');
  36. });
  37. });
  38. //启动服务器,开启监听
  39. server.listen(config.port, config.host, function() {
  40. console.log('server listening at port '+ config.port);
  41. });

p2p.js

  1. /**
  2. 点对点消息
  3. */
  4. exports.p2p = function(socket,data,users) {
  5. var from = data.from;
  6. var to = data.to;
  7. var message = data.message;
  8. //找到要发送人的socket地址对象
  9. var receiver = users[to];
  10. //如果接收人不存在,告诉客户端没有该用户
  11. if(!receiver) {
  12. var send = {
  13. protocal: 'p2p',
  14. code : 2001,
  15. message : '用户不存在'
  16. }
  17. socket.write(Buffer.from(JSON.stringify(send)));
  18. }else {
  19. //如果接收人存在,则将消息发送给该用户
  20. // *** 对你说 : ***
  21. var send = {
  22. protocal : 'p2p',
  23. code : 2000,
  24. from : data.from,
  25. message : message
  26. }
  27. receiver.write(Buffer.from(JSON.stringify(send)));
  28. }
  29. }

broadcast.js

  1. /**
  2. 广播消息
  3. */
  4. exports.broadcast = function(data,users) {
  5. var from = data.from;
  6. var message = data.message;
  7. message = from + ' 说:' + message;
  8. var send ={
  9. protocal : 'broadcast',
  10. message : message
  11. }
  12. send = Buffer.from(JSON.stringify(send));
  13. for(var username in users) {
  14. var tmpSocket = users[username];
  15. tmpSocket.write(send);
  16. }
  17. }

signup.js

  1. /**
  2. 用户注册
  3. */
  4. exports.signup = function(socket,data,users) {
  5. //处理用户注册请求
  6. var username = data.username;
  7. //如果用户名不存在,则将用户名与socket地址绑定
  8. if(!users[username]) {
  9. users[username] = socket;
  10. var send = {
  11. protocal : 'signup',
  12. code : 1000,
  13. username : username,
  14. message : '注册成功'
  15. }
  16. socket.write(JSON.stringify(send));
  17. }else {
  18. var send = {
  19. protocal : 'signup',
  20. code : 1001,
  21. message : '用户名已被占用,请重新输入用户名:'
  22. }
  23. socket.write(JSON.stringify(send));
  24. }
  25. }

github 下载 https://github.com/lick468/chatroom

node.js 简易聊天室的更多相关文章

  1. node.js+websocket实现简易聊天室

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...

  2. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  3. node+websocket创建简易聊天室

    关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...

  4. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  5. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  6. vue + socket.io实现一个简易聊天室

    vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...

  7. Laravel + Swoole 打造IM简易聊天室

    最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. (一)扩展安装 pecl install swool ...

  8. php_D3_“简易聊天室 ”实现的关键技术 详解

                      PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...

  9. Python开发【笔记】:aiohttp搭建简易聊天室

    简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...

随机推荐

  1. iOS NSNotification传递带参数的通知

    普通的通知使用 注册观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNotificat ...

  2. USB驱动分析

    INIT函数: 这是内核模块的初始化函数,其所作的工作只有注册定义好的USB驱动结构体. USB驱动结构体如下: Usb_driver中的probe函数是驱动和设备匹配成功后调用. Usb_drive ...

  3. git 添加码云远程仓库和上传到码云的命令

     添加远程仓库 git remote add Zk  仓库地址.git 查看远程仓库 git remote -v 上传远程仓库 git push Zk master 删除远程仓库Zkgit remot ...

  4. Linux命令——getent

    简介 getent命令帮助用户administrative databases中查找相关信息.administrative databases包括: passwd – can be used to c ...

  5. Pyspark笔记一

    1. pyspark读csv文件后无法显示中文 #pyspark读取csv格式时,不能显示中文 df = spark.read.csv(r"hdfs://mymaster:8020/user ...

  6. Visual Studio Code IDE + Docker实现PHP Xdebug调试

    一.Docker中安装配置Xdebug 通过phpinfo()输出当前安装的PHP版本信息,将信息拷贝到https://xdebug.org/wizard.php相应输入框中,系统会自动检测并推荐合适 ...

  7. Selenium常用API的使用java语言之7-控制浏览器操作

    (六)控制浏览器操作 1.控制浏览器窗口大小 有时候我们希望能以某种浏览器尺寸找开,访问的页面在这种尺寸下运行.例如可以将浏览器设置成移动端大小(480* 800),然后访问移动站点,对其样式进行评估 ...

  8. 实现strStr()函数

    方法一:暴力解法 int strStr(string haystack, string needle) { if (needle.empty()) ; int M = haystack.size(); ...

  9. nginx动静分离配置

    动静分离: 所谓动静分离指的是当访问静态资源时,路由到一台静态资源服务器,当访问是非静态资源时,路由到另外一台服务器 静态资源配置: 如配置如下location 表示url为  /static/*.x ...

  10. HTML 001 入门介绍

    HTML 教程- (HTML5 标准) 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言. 您可以使用 HTML 来建立自己的 ...