通信
-
服务端: 总的服务器
const net = require( 'net' ) //引入net模块,用于创建服务器/客户端 const server = net.createServer() // 创建服务器 const host = 'localhost' // 创建 域名 const port = 5000 // 创建端口 let count = 0 const clients = {} // 数组? 对象? server.on('connection', ( client ) => { // 服务器通过connection事件连接客户端 // client指的是每一个连接的客户端 // client 是有多个 , // 问题: client会错乱 解决: 起名 数字编号 计数 client.name = ++count // 计数,给每一个客户端起名 clients[ client.name ] = client // 将每一个客户端放入clients中存储起来 client.on( 'data', msg => { // 服务器通过data事件来接收客户端发来的信息 // msg 就是客户端发来的信息 , msg这个信息是二进制 console.log( `客户端${ client.name }说:${ msg.toString() }` ) boardCaster( client,msg ) }) client.on( 'error', error => { // 服务器处理错误报出 console.log( 'error is: ' + error ) }) client.on( 'close', () => { // 服务端接收客户端正常下线行为 delete clients[ client.name ] // 从存储client的地方删除下线的客户端 console.log( `客户端${ client.name }下线了` ) }) }) function boardCaster ( client,msg ) { //广播的函数 for( var key in clients ){ // clients[ key ].write( `谁说了什么` ) // 写信息在服务端 clients[ key ].write( `客户端${ client.name }说:${ msg.toString() }` ) // 写信息在服务端 } } // 监听服务器 server.listen( port,host,() => { console.log( `服务器运行在: http://${ host }:${ port }` ) })
-
客户端: 单个用户使用应用
/* 客户端 业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器 解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 【 单行读取 】 */ const net = require( 'net' ) //引入net模块,用于创建服务器/客户端 const socket = net.Socket() //创建客户端 const host = 'localhost' const port = 5000 const readline = require( 'readline') // 读取命令行 // 客户端连接服务器 socket.connect( port,host, () => { socket.write( 'hello 我上线了' ) // 将一个信息发送给服务器 }) const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); socket.on('data', msg => { // 客户端通过data事件展示信息,然后发送信息给服务器 console.log( msg.toString() ) say() }) socket.on( 'error', ( error ) => { //处理错误报出 console.log( 'error is : ' + error ) }) socket.on( 'close', () => { // 客户端正常下线 console.log( `客户端下线了` ) }) function say () { rl.question('请输入:', ( answer ) => { if( answer === 'bye' ){ //表示正常下线 socket.destroy() // 客户端销毁 rl.end() // rl 读取命令行关闭 }else{ //表示正常聊天 socket.write( answer ) } }); }