使用原生node写一个聊天室
在学习node的时候都会练习做一个聊天室的项目,主要使用socket.io模块和http模块。这里我们使用更加原始的方式去写一个在命令行聊天的聊天室。
http模块,socket.io都是高度封装之后的模块,我们使用更加原始的net模块来做。
socket
做聊天室,我们首先要了解一下socket,用百度百科上的定义:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket对TCP/IP封装提供网络开发的接口,提供网络通信的接口。详细可以看看各种百科的资料。
服务端
1.基本接口介绍
创建服务端
const server = net.createServer((socket) => {
//这里的毁掉函数中的参数就是一个socket
}
//监听端口和主机
server.listen({
port:4433,
host:'127.0.0.1'//要想别人访问到,要写服务启动所在机子的ip地址,默认localhost
}, () => {
//这里是启动成功后的回调
console.log('server bound')
})
服务创建成功之后,socket可以提供客户端(访问者)的一些信息,这里主要用的两个属性
socket.remoteAddress :客户端的ip地址
socket.remotePort:客户端访问的接口,这里是随机分配,注意这里的接口跟我们创建服务的接口不同,表示的意义也不一样建立网络通信连接至少要一对端口号,服务端监听的端口是为了跟服务端所在机子的其他服务区分,客户端访问这个端口的时候自然也要区分,分配不同端口
socket的event事件
//监听客户端发送过来的消息
socket.on('data', (data) => {
//这里data是一个buffer要转化为字符串,然后去一下两端空格
let receive = JSON.parse(data.toString().trim());
})
//给客户端发送消息
socket.write(string[,encoding]);
错误处理error
socket.on('error', (err) => {
//在测试中发现,不去监听这个错误事件,当你客户端掉线之后服务端也会断开所以做一些错误处理
})
2.聊天设计
聊天过程我们分三部分
1.登录
2.跟所有人聊
3.跟特定对象聊
首先我们确定聊天信息的发送格式,就像http里面有头部,内容等。我们发送的信息,应该包括发送者名字,给谁发以及发送的消息,设定为一下格式
const send = {
name:"",
message:"",
to:""
}
服务端要根据给谁发做不同的处理
1.登录(login):我们要给所有的人发信息,XXX登录了聊天室,还要记录这个访问的socket,以便于后续给特定的人发消息,格式{username:socket}
2.跟所有人聊天(server):除了发消息本人要给其他人发送
3.跟某一个人聊天(client):找到相应的socket发送消息
socket.on('data', (data) => {
let receive = JSON.parse(data.toString().trim());
switch(receive.to){
case "login":
DealInfo.login(receive, socket);
break;
case "server":
DealInfo.server(receive, socket);
break;
default:
DealInfo.client(receive, socket);
break;
}
})
之前我们有监听socket的错误处理,也就是当用户掉线的时候,我们就可以把记录的socket删除掉,并提示当前用户数。这里可以从记录的socket个数求取,也可以根据以下方法
server.getConnections((err, count) => {
if(err){
throw err;
}
console.log(`${deleteKey}下线了 当前在线人数${count}`);
})
客户端
1.基本接口介绍
创建socket连接
const client = net.connect({
port:4433,
host:'127.0.0.1'//默认localhost
}, () => {
//连接成功之后的回调
})
client的事件
//监听服务端发送过来的信息
client.on('data', (data) => {
//这里data是一个buffer
let receive = JSON.parse(data.toString().trim());
}).on('error', (err) => {
//错误处理
})
//给服务端发送消息
client.wirte(string[, encoding]);
2.聊天设计
基本设置
登录:要输入聊天名再去连接客户端
群聊或者跟某一个人聊只需要区分用户即可,跟某一个人聊的输入格式为name:message
聊天格式:name>message
2.1用户名
这里我们使用readline这个模块
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What is your name >', (name) => {
//回调中的参数就所输入的信息,当输入非空的时候作为用户名,之后按我们的聊天格式输出预先样式
//设立设定prompt的输出内容,只要调用rl.prompt()即可
rl.setPrompt(`${name.trim()}>`);
rl.prompt();
}
监听用户输入
rl.on('line', (line) => {
let stdinInfo = line.trim().split(':');
if(stdinInfo.length == 2){
//跟某个用户聊天
send.to = stdinInfo[0];
send.message = stdinInfo[1];
}else{
//跟所有人聊天
send.to = "server";
send.message = stdinInfo[0];
}
client.write(JSON.stringify(send));
rl.prompt();
})
详细代码地址:https://github.com/Stevenzwzhai/node-socket-chatroom
使用原生node写一个聊天室的更多相关文章
- 原生node写一个静态资源服务器
myanywhere 用原生node做一个简易阉割版的anywhere静态资源服务器,以提升对node与http的理解. 相关知识 es6及es7语法 http的相关网络知识 响应头 缓存相关 压缩相 ...
- Golang之写一个聊天室
. 海量用户在线聊天系统 . 点对点聊天 . 用户登录&注册 一.服务端开发 . 用户管理 用户id:数字 用户密码:字母数字组合 用户昵称:用来显示 用户性别:字符串 用户头像:url 用户 ...
- 零基础实现node+express个性化聊天室
本篇文章使用node+express+jquery写一个个性化聊天室,一起来get一下~(源码地址见文章末尾) 效果图 项目结构 实现功能 登录检测 系统自动提示用户状态(进入/离开) 显示在线用户 ...
- 利用socket.io构建一个聊天室
利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...
- 基于react+react-router+redux+socket.io+koa开发一个聊天室
最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...
- 用原生js写一个"多动症"的简历
用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...
- 使用 NIO 搭建一个聊天室
使用 NIO 搭建一个聊天室 前面刚讲了使用 Socket 搭建了一个 Http Server,在最后我们使用了 NIO 对 Server 进行了优化,然后有小伙伴问到怎么使用 Socket 搭建聊天 ...
- 使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- node+express+socket.io制作一个聊天室功能
首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js var http=require("http ...
随机推荐
- IOS 计算文字尺寸(UILabel)
方式1 :普通用法 #define MJNameFont [UIFont systemFontOfSize:14] /** * 计算文字尺寸 * * @param text 需要计算尺寸的文字 * ...
- SQL的注入式攻击方式和避免方法
SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...
- Codeforces Round #404 (Div. 2) ABC
A. Anton and Polyhedrons Anton's favourite geometric figures are regular polyhedrons. Note that ther ...
- Thread 创建线程
1.该线程变量 无参数 我们可以把线程的变量 理解为一个 委托.可以指向一个方法.有点像c语言中的指向函数的指针. 第1步我们创建了 Thread变量t1 ,第2步创建了一个方法threadChild ...
- iOS开发网络缓存原理
一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...
- Redis高可用
redis高可用只要在于三个方面 主从复制 哨兵机制 集群机制 主从复制 主从复制作用: 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.2.故障恢复:当主节点出现问题时,可 ...
- PHP实现的一个时间帮助类
背景 工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率 主要功能 根据相差的天数获取连续的时间段 /** * 根据相差的天数获取所有连续的时间段 * @param $ ...
- dts--tests(三)
sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...
- 列表,元组的操作,for循环
1.列表 # li = ["wang","jian","wei"] # print(li) # 结果:['wang', 'jian', 'w ...
- win8电脑字体出现方格的解决方法
一般电脑出现乱码有几种可能,最常见的可能就是电脑字体的丢失,其次就是电脑字体被病毒所损坏,因此,首先我们要做的就是下载字体并进行安装. 下载 simsun.tcc点击安装,如果电脑字体依然是这种情况( ...