效果图

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

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

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

然后就是一番对话

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

下面是具体代码

创建一个目录,chatroom。



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

config

module.exports={
"port":3000,
"host":"127.0.0.1"
}

client.js

/**
终端聊天室客户端
*/
var net = require('net');
var config = require('./config');
var client = net.createConnection({
port:config.port,
host:config.host
}); //用户注册成功后为该属性赋值
var username;
client.on('connect',function() {
console.log('请输入用户名:');
process.stdin.on('data',function(data){
data = data.toString().trim();
//判断用户是否存在
if(!username) {
var send = {
protocal : 'signup',
username : data
}
client.write(JSON.stringify(send));
return;
}
//判断是广播消息还是点对点
//name :内容
var regex = /(.{1,18}):(.+)/;
var matches = regex.exec(data);
if(matches) {
var from = username;
var to = matches[1];
var message = matches[2];
var send = {
protocal : 'p2p',
from : username,
to : to,
message : message
}
client.write(JSON.stringify(send));
}else {
var send = {
protocal : 'broadcast',
from : username,
message :data
}
client.write(JSON.stringify(send));
}
});
});
client.on('data',function(data){
data = JSON.parse(data);
switch(data.protocal) {
case 'signup':
var code = data.code;
switch(code) {
case 1000:
username = data.username;
console.log(data.message);
break;
case 1001:
console.log(data.message);
break;
default:
break;
}
break;
case 'broadcast':
console.log(data.message);
break;
case 'p2p':
var code = data.code;
switch(code){
case 2000:
var from = data.from;
var message = data.message;
message = from + '说:' + message;
console.log(message);
break;
case 2001:
console.log(data.message);
break;
default:
break;
}
break;
default:
break;
};
});

server.js

/**
终端聊天室服务器端
*/ var net = require('net');
var config = require('./config');
var broadcast = require('./broadcast.js');
var p2p = require('./p2p.js');
var signup = require('./signup.js');
var server = net.createServer();
var users = {};
server.on('connection',function(socket) {
socket.on('data',function(data) {
//解析客户端发送的数据
data = JSON.parse(data);
//根据客户端发送的数据类型,做相应的操作
switch(data.protocal) {
//用户注册
case 'signup':
signup.signup(socket,data,users);
break;
//广播消息
case 'broadcast':
broadcast.broadcast(data,users);
break;
//点对点消息
case 'p2p':
p2p.p2p(socket,data,users);
break;
//异常
default:
break;
}
});
socket.on('error',function(){
console.log('有客户端异常退出了');
});
});
//启动服务器,开启监听
server.listen(config.port, config.host, function() {
console.log('server listening at port '+ config.port);
});

p2p.js

/**
点对点消息
*/ exports.p2p = function(socket,data,users) {
var from = data.from;
var to = data.to;
var message = data.message;
//找到要发送人的socket地址对象
var receiver = users[to];
//如果接收人不存在,告诉客户端没有该用户
if(!receiver) {
var send = {
protocal: 'p2p',
code : 2001,
message : '用户不存在'
}
socket.write(Buffer.from(JSON.stringify(send)));
}else {
//如果接收人存在,则将消息发送给该用户
// *** 对你说 : ***
var send = {
protocal : 'p2p',
code : 2000,
from : data.from,
message : message
}
receiver.write(Buffer.from(JSON.stringify(send)));
}
}

broadcast.js

/**
广播消息
*/
exports.broadcast = function(data,users) {
var from = data.from;
var message = data.message;
message = from + ' 说:' + message;
var send ={
protocal : 'broadcast',
message : message
}
send = Buffer.from(JSON.stringify(send));
for(var username in users) {
var tmpSocket = users[username];
tmpSocket.write(send);
}
}

signup.js

/**
用户注册
*/
exports.signup = function(socket,data,users) {
//处理用户注册请求
var username = data.username;
//如果用户名不存在,则将用户名与socket地址绑定
if(!users[username]) {
users[username] = socket;
var send = {
protocal : 'signup',
code : 1000,
username : username,
message : '注册成功'
}
socket.write(JSON.stringify(send));
}else {
var send = {
protocal : 'signup',
code : 1001,
message : '用户名已被占用,请重新输入用户名:'
}
socket.write(JSON.stringify(send));
}
}

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. axiso 的使用

    Vue官方推荐的ajax请求框架叫做:axios axios的Get请求语法: axios.get("/item/category/list?pid=0") // 请求路径和请求参 ...

  2. 【前端开发】ES6知识点系统化梳理笔记

    >ES6扩展: #Map和Set是es6标准新增的数据类型 ##Map是key-value(关键字-值),Map允许修改value,不允许修改key,Map支持下标操作 var m = new ...

  3. 记一次B类地址子网划分

    说明:一般内网地址,没有要求严格的划分之类的.需要按要求严格划分一般都是公网地址 温馨提醒:由于笔者功底不是很深厚,只能说我们保证把数算对用相对简单的方法 现有一个公网ip,B类地址130.3.0.0 ...

  4. Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

    之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...

  5. Windows下动态库的制作与使用

    创建静态库

  6. C++——重载原理分析

    C不支持函数重载,C++支持 代码演示 main.c #include<stdio.h> void Max(int a, int b) { printf("%d ", ...

  7. Flask笔记(一)

    first_flask_project.py # 从flask这个包中导入Flask这个类 # Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 # 注册url.注册蓝图等都是基于这个类 ...

  8. Zabbix监控平台-----深入理解zabbix

    一,Zabbix Web操作深入 (1)创建一个模版,所有的功能几乎都是在模版中定义的 点进新创建的模版查看,模版里几乎可以设定我们需要的所有功能 (2)在模版里创建应用集,应用集的作用就是将众多的监 ...

  9. 如何在linux系统下查看日志

    在linux系统下, 首先在idea中使用clean---->install----->package将这个项目进行打包,打包的方式 , 根据你在项目中的pom文件,最上面,可以查看到 这 ...

  10. Ubuntu增加swap交换空间的步骤

    1.首先用命令free查看系统内 Swap 分区大小. free -m total used free shared buffers cached Mem: 2012 1960 51 0 748 95 ...