socket通信

socket通信

/* 
  客户端:
    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 ) => {
      if( answer === 'bye' ){
        //要进行命令行的结束
        socket.destroy() //清除连接
        rl.close()// 关闭命令行读取
      }else{
        socket.write( answer )
      }
    });
  }
/* 

  主服务器:
    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 }` );
  })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值