Node.js 中的 网络编程

简介: Node.js 中的 网络编程

网络编程

构建 TCP 服务

  • 创建 TCP 服务器端
var net = require('net');

var server = net.createServer(function (socket) {
  // 新的连接
  socket.on('data', function (data) {
    socket.write('Hello');
  });

  socket.on('end', function () {
    console.log('连接断开');
  });

  socket.write('Hello world \n');
});

server.listen(8124, function () {
  console.log('server bound');
});
  • net 模块构造客户端
var net = require('net');
var client = net.connect({ port: 8124 }, function () {
  console.log('client connected');
  client.write('world \r\n');
});

client.on('data', function (data) {
  console.log(data.toString());
  client.end();
});

client.on('end', function () {
  console.log('client disconnected');
});
  • TCP 服务的事件

    • 服务器事件

      • listening
      • connection
      • close
      • error
    • 连接事件

      服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可读可写 Stream 对象
      • data
      • end
      • connect
      • drain
      • error
      • close
      • timeout
    // 由于 TCP 套接字是可读可写的 Stream 对象,可以利用 pipe() 方法巧妙实现管道操作
    // 实现 echo 服务器
    var net = require('net');
    
    var server = net.createServer(function (socket) {
      socket.write('Echo server \r\n');
      socket.pipe(socket);
    });
    
    server.listen(1337, '127.0.0.1');

构建 UDP 服务

  • 创建 UDP 服务器端
var dgram = require('dgram');

var server = dgram.createSocket('udp4');

server.on('message', function (msg, rinfo) {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', function () {
  var address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
  • 创建 UDP 客户端
var dgram = require('dgram');

var message = new Buffer('Hello world');
var client = dgram.createSocket('udp4');
client.send(message, 0, message.length, 41234, 'localhost', function (err, bytes) {
  client.close();
});
  • UDP 套接字事件

    UDP 套接字相对 TCP 套接字使用起来更简单,它只是一个 EventEmitter 的实例,而非 Stream 的实例
    • message
    • listening
    • close
    • error

构建 HTTP 服务

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello world\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://localhost:1337');
  • HTTP 服务事件

    • connection
    • request
    • close
    • checkContinue
    • connect
    • upgrade
    • clientError
  • HTTP 客户端
var options = {
  hostname: '127.0.0.1',
  port: 1334,
  path: '/',
  method: 'GET'
};

var req = http.request(options, function (res) {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log(chunk);
  });
});
req.end();
  • HTTP 客户端事件

    • response
    • socket
    • connect
    • upgrade
    • continue

构建 WebSocket 服务

  • WebSocket 较 传统 HTTP 的好处

    • 客户端与服务端只建立一个 TCP 连接,可以使用更少的连接
    • WebSocket 服务器端可以推送数据到客户端,比 HTTP 请求响应模式更灵活、更高效
    • 有更轻量级的协议头,减少数据传送量
  • WebSocket 握手

    • 客户端建立连接时,通过 HTTP 发起请求报文
    • 一旦 WebSocket 握手成功,服务器端与客户端会呈现对等的效果,都能接收和发送消息
  • WebSocket 数据传输

    • 在握手完成后,当前连接不再进行 HTTP 交互,而是开始 WebSocket 的数据帧协议,实现客户端与服务器端的数据交换
相关文章
|
18天前
|
存储 安全 JavaScript
云计算浪潮中的网络安全之舵探索Node.js中的异步编程模式
【8月更文挑战第27天】在数字化时代的风帆下,云计算如同一片广阔的海洋,承载着企业与个人的数据梦想。然而,这片海洋并非总是风平浪静。随着网络攻击的波涛汹涌,如何确保航行的安全成为了每一个船员必须面对的挑战。本文将探索云计算环境下的网络安全策略,从云服务的本质出发,深入信息安全的核心,揭示如何在云海中找到安全的灯塔。
|
19天前
|
JavaScript 算法 前端开发
采招网JS逆向:基于AES解密网络数据
采招网JS逆向:基于AES解密网络数据
32 0
|
3月前
|
JSON 前端开发 JavaScript
在JavaScript中,异步编程是一种处理非阻塞操作(如网络请求、文件读写等)的重要技术
【6月更文挑战第12天】JavaScript中的异步编程通过Promise和async/await处理非阻塞操作。Promise管理异步操作的三种状态,防止回调地狱,支持链式调用和并行处理。async/await是ES8引入的语法糖,使异步代码更像同步代码,提高可读性。两者结合使用能更高效地处理复杂异步场景。
34 3
|
1月前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
36 5
|
24天前
|
JavaScript 前端开发 UED
探索JavaScript的历史:网络需求初现、语言创立与标准化的旅程
探索JavaScript的历史:网络需求初现、语言创立与标准化的旅程
|
30天前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的网络在线考试系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的网络在线考试系统附带文章源码部署视频讲解等
39 0
基于springboot+vue.js+uniapp的网络在线考试系统附带文章源码部署视频讲解等
|
2月前
|
测试技术 API Android开发
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
autox.js如何监听异常情况,比如网络中断、内存慢、应用死机或者页面无响应
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的网络互联实验平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的网络互联实验平台附带文章源码部署视频讲解等
38 0
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的大学生计算机基础网络教学系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的大学生计算机基础网络教学系统附带文章源码部署视频讲解等
24 0