一、主要思想:
1.如果用户A想要发消息给用户B,A需要将消息发送到一个服务器上,服务器接收到A发送的消息之后,再把消息发送给B,B接收到消息
2.当用户B断开连接时服务器不会将消息发送给B
3.socket是一种持久性的连接方式,http一种非持久性的连接方式,所以要实现聊天需要选择socket,使用net模块来创建服务器和客户端
二、 服务端的创建:
1.使用net模块来创建服务器
2.使用net.createServer()创建服务器,并绑定端口号server.listen(9000)
3.使用server.on("connection",(client)=>{})来连接到服务器中,client表示连接进来的客户端
4.使用一个自定义属性id将连接进来的客户端保存在一个空数组cilents中,当某客户端断开时,可通过自定义属性找到是哪一个客户端断开,并将其从数组中删除(clients[client.id]=null)
5.通过client.on("data",(msg)=>{})方法接收客户端传递过来的信息,msg表示客户端的信息
6.通过clients.map((item)=>{})方法遍历存放着所有客户端的数组,当客户端在数组中存在则意味着当前客户端处于连接的状态,则将接收到的信息通过item.write(msg)方法发送给所有处于连接状态的用户
三、客户端的创建
1.使用net模块创建客户端
2.使用const client = new net.Socket();创建一个客户端实例
3.客户端通过client.connect(9000,"127.0.0.1",()=>{})方法使客户端与服务器进行连接,其中9000为端口号,需与服务器的端口号一致,"127.0.0.1"为连接的IP地址,第三个参数为需要执行的回调函数
4.客户端通过client.on("data",(msg)=>{})方法来接收服务器传递过来的消息,msg表示消息
5.为了提高用户体验,需要创建文件的读写流,使用户可以在终端中写入多个信息,则使用readline模块创建文件读写流:
const readline = require("readline");
const rl = readline.createInterface({
input:process.stdin,
output:process.stdout
})
6.将输出出来的文件格式从buffer文件转换为字符串:client.setEncoding("utf8");