Node入门教程(11)第九章:Node 的网络模块
net网络模块
net模块是node对TCP或者IPC开发的封装,包括了客户端和服务器端相关API。对于阅读本文,请您有一定的网络编程的基础。
您需要已经了解了:
- ip协议,会配置ip地址
- 了解dns解析过程,了解dns的概念
- 了解基本的TCP的协议的
- 了解Socket的编程相关概念
- 了解node的事件处理、流、文件处理等
- 了解HTTP协议
本文,仅对部分API和TCP开发做一些简单介绍。
创建TCP服务器端
net.Server 类用于创建TCP的server,而且继承了EventEmitter。通过net.createServer([options][, connectionListener])方法创建此类型实例。
const net = require('net');
// 创建服务器端的
const server = net.createServer();
// 监听异常错误事件
server.on('error', err => {
// throw err;
console.log(err);
});
// 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的socket
server.on('connection', clientSocket => {
console.log('客户端:%s', clientSocket.remoteAddress);
// 监听此客户端的end事件。
clientSocket.on('end', () => {
console.log('client disconnected');
});
// 监听此客户端发送数据的事件。
clientSocket.on('data', data => {
console.log('收到数据:%s', data);
});
// 向客户端发送数据
clientSocket.write('Hi, aicoder.com ');
// 2s后让客户端退出
setTimeout(() => {
// 通知客户端退出,并发送数据。
clientSocket.end('bye!');
}, 2000);
});
// 服务器开始监听60003端口(端口:0-65535之间的一个值)
server.listen(60003, () => {
console.log('opened server on', server.address());
});
// 以下为关闭监听的实例
// setTimeout(() => {
// console.log('服务器端退出!!!');
// server.close();
// }, 5000);
net.Server 是对服务器端的Socket的封装,可以监听close事件、error事件、connection 事件、listening 事件。还可以通过close()方法关闭服务的监听。其他用法参考官网文档。
net.Socket 类是对客户端Socket的封装,可以监听 close 事件、 connect 事件 、data事件、drain 事件、end 事件、error 事件、lookup 事件、timeout 事件。可用的方法包括:write()发送数据、edn()结束连接等。其中可以同data事件来处理服务器端的数据。
创建TCP的客户端
net.createConnection()方法可以实现连接服务器端,并生成一个net.Socket 类实例,跟服务器端进行交互就是靠此实例。
const net = require('net');
// 创建连接到服务器的客户端
let client = net.createConnection('60003', '127.0.0.1', () => {
client.write('Hi, client, for aicoder.com');
console.log('连接上服务器端!');
});
client.on('error', err => {
console.log(err);
});
client.on('end', () => {
console.log('结束连接!');
});
client.on('close', () => {
console.log('退出');
});
client.on('data', data => {
console.log('收到数据: %s', data);
});
通过Socket上传文件的例子
const net = require('net');
const path = require('path');
const fs = require('fs');
// 创建服务器端的
const server = net.createServer();
// 监听异常错误事件
server.on('error', err => {
console.log(err);
});
// 监听客户端的连接事件,客户端连接上后,会自动执行回调函数,回调函数的参数就是指向客户端的socket
server.on('connection', clientSocket => {
console.log('客户端:%s', clientSocket.remoteAddress);
// 监听此客户端的end事件。
clientSocket.on('end', () => {
console.log('client disconnected');
});
// 监听此客户端发送数据的事件。
clientSocket.on('data', data => {
console.log('收到数据:%s', data);
let fileName = path.join(__dirname, 'b.html');
let ws = fs.createWriteStream(fileName);
ws.write(data, 'utf8');
});
// 向客户端发送数据
clientSocket.write('Hi, aicoder.com ');
});
// 服务器开始监听60003端口(端口:0-65535之间的一个值)
server.listen(60003, () => {
console.log('opened server on', server.address());
});
// 以下是客户端代码
const client = net.createConnection(60003, '127.0.0.1', () => {
console.log('连接上服务器端!');
let fileName = path.join(__dirname, 'a.html');
let rs = fs.createReadStream(fileName, { encoding: 'utf8' });
// socket本身是可读可写流,所以可以直接用管道。
rs.pipe(client);
});
模拟一个WEB服务器软件
如果您已经了解了HTTP协议的话,而且已经掌握如何做TCP的发送数据和接受处理数据,再有您稍微掌握一点字符串处理的技巧,那么您就很容易做一个简单的静态web服务器出啦。当然这里是说用底层的API,不是用http模块。
限于篇幅,在此不再赘述,请直接看我的github源码,仅仅是demo,不要用于生产环境中。
总结
node中对socket的封装,还是比较像node的开发风格的,可能跟其他平台的socket编程的风格不一致,但是原理和开发方式都是一样的。这里仅仅是简单介绍一下Node下面网络编程的基本方法,细节请参考官网文档。
Node入门教程(11)第九章:Node 的网络模块的更多相关文章
- D3.js的v5版本入门教程(第九章)——完整的柱状图
D3.js的v5版本入门教程(第九章) 一个完整的柱状图应该包括的元素有——矩形.文字.坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是 d3.scaleBa ...
- Node入门教程(2)第一章:NodeJS 概述
Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Node入门教程(3)第二章: Node 安装
Node 安装 官网下载地址: https://nodejs.org/en/download/ 安装方式 windows 下安装 建议直接选择:Windows Installer (.msi)下载进行 ...
- 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构
知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...
- 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流
知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...
- ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...
- ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...
- Node入门教程(8)第六章:path 模块详解
path 模块详解 path 模块提供了一些工具函数,用于处理文件与目录的路径.由于windows和其他系统之间路径不统一,path模块还专门做了相关处理,屏蔽了彼此之间的差异. 可移植操作系统接口( ...
- Node入门教程(1)目录
aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 ...
随机推荐
- IdentityServer4-前后端分离之Vue(七)
前言 之前文章讲到如何使用Node.js+Express构建JavaScript客户端,实现前后端分离.本节将介绍如何使用Vue实现前后端分离,文中介绍Vue的知识比较基础,适合新手学习. 一.搭建V ...
- js数据结构之hash散列的详细实现方法
hash散列中需要确定key和value的唯一确定关系. hash散列便于快速的插入删除和修改,不便于查找最大值等其他操作 以下为字符和数字的hash散列: function HashTable () ...
- ARM总线架构
S3C2440集成了丰富了外设控制器(LCD控制器.USB Device控制器.USB Host控制器.NAND FLASH控制器.I2C控制器.SPI控制器等).要控制这些外设就要设置相应控制器的寄 ...
- 潭州课堂25班:Ph201805201 并发(进程,线程) 第十一课 (课堂笔记)
线程,进程,是实现并发的方法, 并行: 在同一时刻,同时运行多个任务,CPU 的数量大于等于任务数量, 并发: 在同一时间间隔内, 同时处理多个任务, 并行是并发. 进程:表示一个正在执行的程序, 操 ...
- C++学习笔记40:进程应用
进程创建 system()函数:用于在程序中执行一条命令 如果shell不能运行,返回127,如果发生其他错误返回-1: 例子:int ret_val = system(“ls -l /”); for ...
- json字符串转换对象的方法
为了方便读者了解json的使用,读者直接粘贴下面代码看效果即可: var json1 = {'name':'小李','age':'11','sex':'女'}; console.log(json1.n ...
- spring如何解决单例循环依赖问题?
更多文章点击--spring源码分析系列 1.spring循环依赖场景2.循环依赖解决方式: 三级缓存 1.spring循环引用场景 循环依赖的产生可能有很多种情况,例如: A的构造方法中依赖了B的实 ...
- Android HttpURLConnection.connect找不到源 HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法
Android HttpURLConnection.connect找不到源 HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法 以下代 ...
- Java容器:HashTable, synchronizedMap与ConcurrentHashMap
首先需要明确的是,不管使用那种Map,都不能保证公共混合调用的线程安全,只能保证单条操作的线程安全,在这一点上各Map不存在优劣. 前文中简单说过HashTable和synchronizedMap,其 ...
- Mac如何找到从AppStore下载的正版Xcode安装包、以及Xcode清理缓存
前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取某个安装包,前提是你正在从AppStore安装这个程序.比如你想提取im ...