使用原生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 ...
随机推荐
- jmeter参数化读取数据进行多次运行
jmeter参数化数据,可以使用csv,还可以使用数据库的方式 1.使用csv读取数据 在线程组中,配置原件中,选择csv data set config 1.本地创建了16个数据,存为test.tx ...
- Hash模板
;//一般为靠近总数的素数 struct Hashtable { int x;//hash存的值 Hashtable * next; Hashtable() { next = ; } }; Hasht ...
- TCP的可靠连接是如何产生的?
http://bbs.csdn.net/topics/190011812 看过TCP/IP的源代码没?tcp中所谓的连接只是在tcp的tcb中存储了对端的地址信息,并且记录连接的状态,通过重发之类的来 ...
- 百度Ueditor 图片上传无反应,显示上传0张,不能点确定
解决办法: \Data\Ueditor\php\Uploader.class.php 190行左右 /** * 获取文件扩展名 * @return string */ private function ...
- caffe 输入图像图像加高斯噪声
这是在frcnn_data_layer的操作,即读图片的操作 if (param.gaussian_noise()) { CHECK(img.type() == CV_8UC3) << & ...
- Java 截屏工具类
PrintScreenUtils.java package javax.utils; import java.awt.AWTException; import java.awt.Dimension; ...
- php curl使用总结(一)
今天和第三方支付做对接的时候,在本地用wamp(php版本5.4.14)运行他们的支付demo的时候,报了一个错误.loadXML函数中不能传空值.排查代码的时候,发现他们用了curl,我以前也接触过 ...
- AngularJS 外部文件中的控制器
在大型的应用程序中,通常是把控制器存储在外部的文件中. <!DOCTYPE html><html><head><meta http-equiv="C ...
- 前端面试题(来自前端网http://www.qdfuns.com/notes/23515/c9163ddd620baac5dd23141d41982bb8.html)
HTML&CSS 1. 常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1)浏览器:IE,Chrome,FireFox,Safari,Opera. (Q2)内核:Trid ...
- vue面试常被问到的问题整理
1.Vue的双向数据绑定原理是什么? 答 : vue是采用数据劫持,并且使用发布-订阅者的开发模式.原理是观察者observer通过Object.defineProperty()来劫持到各个属性的ge ...