Node中的net模块提供的前端通信

  • Node中的net模块提供的前端通信

    • 客户端

      业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器

      解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 【 单行读取 】,readline适合动态交互式流处理,当流被创建时,readline只会监听新增的行而忽略已有的行。

        const net = require( 'net' )//第一步引入内置模块net
      const socket = net.Socket()//第二步创建客户端
      const host = 'localhost'//定义服务器的域名
      const port = 5000 //定义服务器的端口
      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.close()//读取命令行关闭
        }else{
           //表示正常聊天
           socket.write( answer )
        }
      });
      }
    • 服务器

        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 }` )
      })

猜你喜欢

转载自www.cnblogs.com/yurq/p/11210519.html