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

Node中的net模块提供的前端通信的更多相关文章

  1. 关于node中两个模块相互引用却不会死循环的问题

    关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...

  2. node中的url模块解析结果

    1. URL模块作用: url 模块用于处理与解析 URL. 使用方法如下: const url = require('url'); 2. URL 字符串与 URL 对象 URL 字符串是结构化的字符 ...

  3. 说说对 Node 中的 fs 模块的理解? 有哪些常用方法?

    一.是什么 fs(file system),该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装 可以说,所有与文件的操作都是通过fs核心模块实现 导入模块如下: const fs  ...

  4. Node中的http模块

    通过Node模块,我们可以实现客户端和服务器端.这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码.读完本文,将能够实现client向server发送数据,而server将数据原样 ...

  5. Node中require第三方模块的规则

    Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...

  6. node中npm安装模块的网络问题

    最近使用node开发时,发现所有的依赖模块都安装不了啦,一直报错如下 rollbackFailedOptional: verb npm-session 5a4a66a1b8d06dc3 后来才发现是由 ...

  7. Node中使用mysql模块遇到的问题

    Node的mysql模块,本人的感受就是不好用,各种报错,各种坑,有一个问题困扰了我很久,也不知道是不是我使用的方式不对,不过后来用easymysql模块解决了,我才深信这是一个坑. 问题描述: 假设 ...

  8. node中的cluster模块开启进程,进程共享数据

    说明:共享数据 var collection = [41, 41, 41, 41] master.js console.log('###---start---###') var cluster = r ...

  9. node.js中使用http模块创建服务器和客户端

    node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...

随机推荐

  1. Django之model.form创建select标签

    前言 之前我们学习了form表单验证用户输入格式和自动创建HTML,那么如果用户创建select标签时怎么办呢,先来看下这个东西: models.py 数据格式: class UserInfo(mod ...

  2. 【leetcode_easy】581. Shortest Unsorted Continuous Subarray

    problem 581. Shortest Unsorted Continuous Subarray 题意:感觉题意理解的不是非常明白. solution1: 使用一个辅助数组,新建一个跟原数组一模一 ...

  3. Spring mvc +ajax 发送邮件

    1.前端页面--form表单提交,通过发送按钮的id=“send”定位DOM,触发ajax请求 <form class="form-horizontal" id=" ...

  4. spring mvc框架+ ajax实现 文件上传

    1.前端页面,通过form表单提交,必须设置 enctype="multipart/form-data" 代表form表单在发送到服务器时候编码方式是二进制类型,一般用于图片.mp ...

  5. 【c# 学习笔记】使用virtual和override关键字实现方法重写

    只有基类成员声明为virtual或abstract时,才能被派生类重写:而如果子类想改变虚方法的实现行为,则必须使用override关键字. public class Animal { private ...

  6. vue项目使用keep-alive的作用

    在vue项目中,难免会有列表页面或者搜索结果列表页面,点击某个结果之后,返回回来时,如果不对结果页面进行缓存,那么返回列表页面的时候会回到初始状态,但是我们想要的结果是返回时这个页面还是之前搜索的结果 ...

  7. office word 設置默認的縮放為100%, office word set default Zoom to 100% permanently

    如題,今天剛好遇到一個老師不知道什麽原因造成Microsoft office word 每次打開都會縮放到70% ,所以google 了一下,還真有解決方法. 只要將默認的 使用者範本檔 Normal ...

  8. FineReport点击输入框直接展示下拉框列表

    引用自帆软官方文档-http://help.finereport.com/doc-view-1899.html 1. 描述 下拉框以及下拉复选框默认状态,必须点击最右侧的三角才可以实现下拉,不够人性化 ...

  9. 解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题

    系统环境: 操作系统:Ubuntu 18.04.01 显卡型号:GeForce GTX 1060 6G CMake 版本:3.10.2 GCC 版本:7.4.0 GNU Make 版本:4.1 CUD ...

  10. AMD, CMD, CommonJS和UMD

    我的Github(https://github.com/tonyzheng1990/tonyzheng1990.github.io/issues),欢迎star 今天由于项目中引入的echarts的文 ...