node.js 简易聊天室
效果图
首先开启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 简易聊天室的更多相关文章
- node.js+websocket实现简易聊天室
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) websocket提供了一种全双工客户端服务器的异步通信方法,这种通信方法使用ws或者wss协议,可 ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- Express+Socket.IO 实现简易聊天室
代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
- vue + socket.io实现一个简易聊天室
vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...
- Laravel + Swoole 打造IM简易聊天室
最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. (一)扩展安装 pecl install swool ...
- php_D3_“简易聊天室 ”实现的关键技术 详解
PHP+MySQL实现Internet上一个简易聊天室的关键技术 系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...
- Python开发【笔记】:aiohttp搭建简易聊天室
简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...
随机推荐
- ZYNQ工程PL顶层创建block module报错解决
参考文档 https://www.cnblogs.com/chengqi521/p/7977616.html 前言 对于ZYNQ的开发,顶层一般为PS+PL,而PL一般会封装成顶层,只露出接口. 而P ...
- jquery sortable的拖动方法示例详解1
转自:https://www.jb51.net/article/45803.htm 所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象 ui.helper ...
- 七年开发小结MyBatis 在 Spring 环境下的事务管理
MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFin ...
- git 把其他分支上的文件拿来覆盖本地
1:git checkout oldversion -- 文件地址 2: 一个分支从某个角度讲也像是一次commmit,也是有向无环图的一个点
- 网站seo搜索引擎优化
SEO综合查询方式:http://seo.chinaz.com/网站地址(一般为域名地址),比如:http://seo.chinaz.com/www.test.com 搜索关键字(keywords)优 ...
- 基于numpy实现矩阵计算器
要求 制作一个Python的矩阵计算器: ① 程序提供任意两矩阵的加.乘法运算:方阵的行列式计算.逆矩阵计算.特征分解:任意矩阵的转置等计算功能,可自行添加功能 ② 从控制台通过键盘获取数据并完成以上 ...
- 每日一题-——LeetCode(617) 合并二叉树
题目描述: 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠.你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值 ...
- 数组中的reduce
reduce方法第一次对我的感觉是很鸡肋,但是深入了解,才发现其中的奥妙,是个非常强大且实用的方法 var arr = [1,2,3,4,5,6,7]; var sum = arr.reduce( ( ...
- Linux 本机/异机文件对比
一:提取异步机器文件 #ssh 192.168.1.2 "cat /etc/glance/glance-api.conf | grep -v '#' |grep -v ^$" 二: ...
- G1垃圾收集器原理剖析【官方解读】
继续基于上一次https://www.cnblogs.com/webor2006/p/11135005.html的官方G1文档进行解读,上一次分析到了这: 话不多说,继续往前读: When perfo ...