node模块之net模块——socket

当我们去面试的时候,常常会遇到这样一个问题:当用户在浏览器地址栏输入一段url发出资源请求后,到服务端返回数据呈现给用户的这个过程都发生了什么?

我们把进行通信的这两个端(这里指的是,浏览器和资源获取的地方)称之为客户端和服务端。我们连通两个端进行通信,靠的就是socket这个东西。他将特定格式的内容进行传递,以达到客户端和服务端通信的目的。

最近刚好在学习node的net模块,接触到这一块内容。下面就来看看node中socket通信的一种实现方式。

client.js

// 客户端

const net = require(‘net‘);

const readline = require(‘readline‘);
const rl = readline.createInterface(process.stdin, process.stdout);

rl.question(‘What is your name? ‘, (name) => {
  name = name.trim();
  if (!name) {
    throw new Error(‘名字没有提供‘);
  }
  // 创建于服务端的连接
  var server = net.connect({ port: 2080, host: ‘192.168.1.56‘ }, () => {

    console.log(`Welcome ${name} to 2080 chatroom`);

    // 监听服务端发过来的数据
    server.on(‘data‘, (chunk) => {
      try {
        var signal = JSON.parse(chunk.toString().trim());
        var procotol = signal.procotol;
        switch (procotol) {
          case ‘boardcast‘:
            console.log(‘\nboardcast[‘ + signal.from + ‘]> ‘ + signal.message + ‘\n‘);
            rl.prompt();
            break;
          default:
            server.write(‘再瞅试试!‘);
            break;
        }
      } catch (error) {
        server.write(‘你瞅啥!‘);
      }
    });

    rl.setPrompt(name + ‘> ‘); // 此时没有写到控制台

    rl.prompt(); // 写入控制台

    // 输入一行内容敲回车触发
    rl.on(‘line‘, (line) => {

      // {"procotol":"boardcast","from":"张三","message":"你瞅啥!"}
      var send = {
        procotol: ‘boardcast‘,
        from: name,
        message: line.toString().trim()
      };

      server.write(JSON.stringify(send));

      rl.prompt();

    })
    .on(‘close‘, () => {
      // console.log(‘Have a great day!‘);
      // process.exit(0);
    });

  });
});

server.js

// 建立一个Socket服务端

const net = require(‘net‘);

// 用于存储所有的客户端连接
var clients = [];

var server = net.createServer((socket) => {

  // socket.setEncoding(‘utf8‘);

  // 哪个客户端与我连接socket就是谁
  clients.push(socket);

  console.log(`Welcome ${socket.remoteAddress} to 2080 chatroom 当前在线${clients.length}`);

  // 触发多次
  socket
  .on(‘data‘, clientData)
  .on(‘error‘, (err) => {
    clients.splice(clients.indexOf(socket), 1);
    console.log(`${socket.remoteAddress}下线了 当前在线${clients.length}`);
  });

});

// 广播消息
function boardcast(signal) {
  // console.log(signal);
  // 肯定有用户名和消息
  var username = signal.from;
  var message = signal.message;
  // 我们要发给客户端的东西
  var send = {
    procotol: signal.procotol,
    from: username,
    message: message
  };
  // 广播消息 遍历每一个客户端,并向其写入内容
  clients.forEach(client => {
    client.write(JSON.stringify(send));
  });
}

// 有任何客户端发消息都会触发
function clientData(chunk) {
  // chunk:boardcast|张三|你瞅啥!
  // chunk:{"procotol":"boardcast","from":"张三","message":"你瞅啥!"}
  // chunk:{"procotol":"p2p","from":"张三","to":"李四","message":"瞅你咋地!"}
  try {
    var signal = JSON.parse(chunk.toString().trim());
    var procotol = signal.procotol;
    switch (procotol) {
      case ‘boardcast‘:
        boardcast(signal);
        break;
      // case ‘p2p‘:
      //   p2p(signal);
      //   break;
      // case ‘shake‘:
      //   shake(signal);
      //   break;
      default:
        socket.write(‘再瞅试试!‘);
        break;
    }
  } catch (error) {
    socket.write(‘你瞅啥!‘);
  }
}

var port = 2080;
server.listen(port, (err) => {
  if (err) {
    console.log(‘端口被占用‘);
    return false;
  }
  console.log(`服务端正常启动监听【${port}】端口`);
});

原文地址:https://www.cnblogs.com/zyl-Tara/p/9771789.html

时间: 2024-10-11 15:14:55

node模块之net模块——socket的相关文章

Node.js的Formidable模块的使用

今天总结了下Node.js的Formidable模块的使用,下面做一些简要的说明. 1)     创建Formidable.IncomingForm对象 var form = new formidable.IncomingForm() 2)     form.encoding = 'utf-8' 设置表单域的编码 3)     form.uploadDir = "/my/dir"; 设置上传文件存放的文件夹,默认为系统的临时文件夹,可以使用fs.rename()来改变上传文件的存放位置

Node.js的net模块

net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法 创建TCP服务器 net.createServer方法 创建客户端去连接服务器 net.connect方法 简易聊天室服务端 chatServer.js var net = require('net'); // 创建TCP服务器 var server = net.createServer(); // 存储所有客户端socket var sockets = []; //接收客户端连接请求 server.on(

使用Node.js 和ws 模块构建WebSocket服务器

Node.js 中的ws 模块是最新的一个易用的.速度超快的web socket 实现,可以用来快速构建web socket 应用.其中还包含了wscat 命令行工具,可以用来模拟客户端或者服务器端. 在本实例中,我们将研究能够找到的最快的WebSocket 服务器.Node.js 中ws 模块不仅执行超快,而且使用也很简单.它实施方便,是本实例介绍Websocket 的理想选择. ws 模块很新,符合当前HyBi 协议草案,可以发送和接收数组类型数据(ArrayBuffer.Float32Ar

Node.js中的模块机制

本文为读书笔记. 一.CommonJS的模块规范 Node与浏览器以及 W3C组织.CommonJS组织.ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范. CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识3个部分. 1. 模块引用 模块引用的示例代码如下: var math = require('math'); 在CommonJS规范中,存在require()方法,这个方法接受模

Node.js入门:模块机制

CommonJS规范  早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端JavaScript的推动,JavaScript现有的规范十分薄弱,不利于JavaScript大规模的应用.那些以JavaScript为宿主语言的环境中,只有本身的基础原生对象和类型,更多的对

Node.js 初识 fs 模块

fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 Unix 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了 同步 和 异步 两个版本,比如读取文件内容的函数有 异步的 fs.readFile() 和 同步的 fs.readFileSync(). Node.js 导入文件系统模块的语法如下: var fs = require('fs'); 1.异步和同步读取文件 fs.readFile(file[, options], callback(err,

初学Node(三)模块系统

模块系统 Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块. require使用 在Node中我们可以使用require()导入一个模块,此时我们就会获得一个被导入模块的对象,我们就可以利用这个对象来完成一些操作,例如: var fs = require("fs"); fs.readFile("content.txt",function(err,data){ if(err)

node.js实用小模块

1.浮点数操作 npm install float 2.MD5加密类 npm install MD5 3.xml解析类 1 npm install elementtree 4.转换字符串大小写 1 npm install convert_str 5.SoapClient 1 npm install soap 6.字符串操作类 1 npm install string 7.缓存 1 npm install memory-cache 8.jsontoxml;  objecttoxml 1 npm i

Node.js(window)基础(2)——node环境下的模块,模块间调用

参考:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434502419592fd80bbb0613a42118ccab9435af408fd000 1.node环境下的模块(module)概念:一个name.js文件就是一个模块,name是模块名称,模块中的函数方法称之为变量. 2.模块变量的调用:A.js中输出变量module.exports=函数名称; B.js引入模

Node.js 教程 04 - 模块系统

前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的. 换言之,一个Node.js文件就是一个模块,这个文件可能是Javascript代码.JSON或者编译过的C/C++扩展. 实例一: 这个实例演示的是,在hello.js中创建一个方法,然后在主程序main.js中调