使用原生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 ...
随机推荐
- .net core 下调用.net framework框架的WCF方法写法
通过添加服务引用后生成的代码,可以得知首先要设置Basic连接写法的属性,并且设置WCF服务的地址: 我在这里建立工厂类如下: using System; using System.ServiceMo ...
- 关于nutz跨服务器上传文件
关于nutz跨服务器上传文件 发布于 578天前 作者 yong9664 770 次浏览 复制 上一个帖子 下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...
- vsftpd 启动 vsftpd:500 OOPS: bad bool value in config file for: guest_enable
不然启动时会涌现毛病,举个例子 guest_enable=YES 后面出现空格,就会出现 为 vsftpd 启动 vsftpd:500 OOPS: bad bool value in config ...
- 【[TJOI2018]异或】
写板子了,可持久化\(Trie\)的板子了 其实和主席树写法类似,还是存好左右儿子之后存好权值 之后差分去查询就好了 这道题第一问我们直接\(dfs\)序转化成区间 第二问搞成\(x,y,lca(x, ...
- 在CentOS 6.5上安装NodeJS
CentOS的软件源未包含有最新的nodejs, 需要手动编译安装. 首先安装依赖的库与工具 yum install libtool automake autoconf gcc-c++ openssl ...
- Nginx + uWSGI + web.py 搭建示例
(1)安装Nginx1.1 下载nginx-1.0.5.tar.gz并解压1.2 ./configure (也可以增加--prefix= path指定安装路径)此时有可能会提示缺少pcre支持,如果要 ...
- openstack kilo 命令行
把下面内容放到.bashrc中,或者直接执行也行. export OS_USERNAME=adminexport OS_PASSWORD=admin #根据实际密码来设 ...
- matlab linux下无界面运行
今日做吸引域的仿真,由于需要遍历100*100*100的空间,需要的时间比较长,发现程序没运行一段时间,就会出现Out of memory的错误,而且出错的部分在于截取figure内部图片的部分. 开 ...
- 第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列
第45章 DCMI—OV2640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com ...
- Spring Bean依赖但注入(autowired或resource)时NullPointerException(xml和annotation混用的场景下)
项目中同时使用了xml和annotation的方式管理Spring Bean 启动时候报NullPointerException,依赖注入失败! 参考: http://fly0wing.iteye.c ...