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 ...
随机推荐
- JSON--stringify() 和 JSON--parse() 方法
序列化:stringify()将JavaScript对象序列号为JSON字符串反序列化:parse()将JSON字符串解析为原生JavaScript值 序列化选项:JSON.stringify()除了 ...
- JacksonJson的使用
JacksonJson是SpringMVC内置的json处理工具,其中有一个ObjectMapper类,可以方便的实现对json的处理: //对象转字符串 // json处理工具 private Ob ...
- vue中计算属性和侦听属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android小经验:启动Eclipse,出现提示“......发现了以元素'd:skin'开头的无效内容。此处不应含有子元素...”
如图所示: 解决办法: 进入sdk目录下,把D:\android-sdks\system-images\android-22\android-wear\armeabi-v7a\devices.xml和 ...
- SSL证书生成流程
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
- EntityFramework 两个参数连续(中间有空格)问题
昨天在项目中,用到 EntityFramework 通过SQL语句查询. 具体的SQL语句如下: SELECT t.* FROM ( SELECT c.id AS CommunityId, c.`na ...
- 四舍五入toFoxed方法
四舍五入的方法: Number.prototype.toFixed = function (n) { if (n > 20 || n < 0) { throw new RangeError ...
- 新闻系统——VS制作自己的模板
我们在做机房管理的项目时,就用过模板方法,建立一个模板,这样就会省很多事,我们不需要每次都添加同样的东西,比如我们的类窗体,就可以制作一个模板,将注释和需要引用的控件直接添加上,这可以省去很大的麻烦, ...
- appium+python+iOS 环境搭建,安装fbsimctl
(1)设置postBuffer的值 开始如下的安装之前,需先修改postBuffer的值,默认的比较下,会导致下载大文件时失败, 参考链接:http://blog.sina.com.cn/s/blog ...
- Java原子类--AtomicLongArray
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514604.html AtomicLongArray介绍和函数列表 在"Java多线程系列-- ...