基于后端的通信
- node.js中有一个net模块
- 使用终端( shell )作为客户端
- 思维流程
主服务器:
/*
主服务器:
1. 创建服务器
2. 连接客户端
3. 获取客户端发来的信息
4. 将客户端发来的信息展示到自己的终端上( 广播 )
*/
const net = require( 'net' );
const port = 9000;
const hostname = 'localhost';
const clients = {}; //是用来存储每一个客户端的
let count = 0; //是用来给客户端编号的
// 1. 创建服务器
const server = new net.createServer();
// 2. 连接客户端
server.on( 'connection', client => {
/*
client指的就是连接服务器的那个客户端
这个事件的触发( 订阅 )条件: 只要有客户端连接,就会触发
*/
client.name = ++count; // 给每一个客户端起一个名字
clients[ client.name ] = client; // 将每一个客户端都存储在 clients中,clients中key就是client的名字
// 3. 获取客户端发来的信息
client.on( 'data', msg => {//msg就是获取的客户端信息
console.log( `客户端 ${ client.name }说: ${ msg.toString()}` )
boardcast( client, msg.toString() )
})
// 监听客户端的异常
client.on( 'error', error => {
console.log( `error is ${ error }` )
})
// 监听客户端的下线行为
client.on( 'close', () => {
//将下线的客户端清除 -- 清除一个对象中的一个属性 clients = { '0': client }
delete clients[ client.name ]
console.log(`客户端 ${ client.name } closed~~`)
})
})
// 4. 将客户端发来的信息展示到自己的终端上( 广播 )
function boardcast ( client,msg ) { //广播
/*
client 客户端
msg 客户端发来的信息
*/
// 将所有的客户端信息都展示在自己的界面上
for( var key in clients ){
clients[ key ].write( msg )
}
}
//5. 监听服务器
server.listen( port,hostname,() => {
console.log( `The server is running at: http://${ hostname }:${ port }` );
})
客户端:
/*
客户端:
1.创建socket
2.socket连接服务器
3.给服务器发送信息
*/
//1.创建socket
const net = require( 'net' );
const socket = new net.Socket();
const port = 9000;
const hostname = 'localhost';
const readline = require( 'readline' );//这是用来做命令行读取的
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
//2.socket连接服务器
socket.connect( port,hostname,() => {
//当我第一次连接好服务器之后,我给服务器发送一个我连接好的信息
socket.write( '欢迎xxx来到xxx的直播间' )
})
//客户端监听自己的异常
socket.on( 'error',error => {
console.log( `socket error is ${error}` )
})
socket.on( 'close',() => {
console.log( `socket connection closed ~~~`)
})
//3.给服务器发送信息
socket.on( 'data',msg => {
console.log( msg.toString() )//客户端自己显示写的内容
say()
})
function say () {
rl.question('请输入:', (answer) => {
/*
answer就是我们在命令行写入的内容
*/
if( answer === 'bye' ){
//要进行命令行的结束
socket.destroy()//清除连接
rl.close()//关闭命令行读取
}else{
socket.write( answer )
}
});
}