windows下《七天学会NodeJS》学习笔记之四--网络操作

开门红

  1. NodeJS本来的用途是编写高性能的Web服务器。下面是一个使用NodeJS内置的http模块简单实现HTTP服务器的例子:

    1. var http = require(‘http‘);
    2. http.createServer(function (request, response) {
    3. response.writeHead(200, { ‘Content-Type‘: ‘text-plain‘ });
    4. response.end(‘Hello World\n‘);
    5. }).listen(8124);

    运行后,直接用浏览器访问http://127.0.0.1:8124/就能看到效果。(linux下可能需要权限)

API走马观花

  1. 在NodeJS中,可以通过‘process’对象感知和控制NodeJS自身进程的方方面面。另外需要注意的是,‘process’不是内置模块,而是一个全局对象,因此在任何地方都可以直接使用。
    Process:
  2. 使用‘child_process‘模块可以创建和控制子进程。该模块提供的API中最核心的是‘.spawn‘,其余API都是针对特定使用场景对它的进一步封装,算是一种语法。
    Child Process:
  3. ‘cluster‘模块是对‘child_process‘模块的进一步封装,专用于解决单进程NodeJS Web服务器无法充分利用多核CPU的问题。使用该模块可以简化多进程服务器程序的开发,让每个核上运行一个工作进程,并统一通过主进程监听端口和分发请求。

典型应用场景

1.如何获取命令行参数:在NodeJS中可以通过‘process.argv’获取命令行参数。但是比较意外的是,node执行程序路径和主模块文件路径固定占据了‘argv[0]’和‘argv[1]’两个位置,而第一个命令行参数从‘argv[2]’开始。为了让‘argv’使用起来更加自然,可以按照以下方式处理。

  1. function main(argv) {
  2. // ...
  3. }
  4. main(process.argv.slice(2));
  1. 如何退出程序:正常退出状态码为0,如果遇到异常想手工退出,可以指定该错误码。
    try {

    1. // ...
    2. } catch (err) {
    3. // ...
    4. process.exit(1);
    5. }
  2. 如何输入输出:NodeJS程序的标准输入流、一个标准输出流、一个标准错误流分别是:process.stdin,process.stdout,process.stderr,第一个是只读数据流,后两个是只写数据流。下面是一个例子:
    1. unction log() {
    2. process.stdout.write(
    3. util.format.apply(util, arguments) + ‘\n‘);
    4. }
  3. linux下,需要root权限才能监听1024以下端口,但是完成监听后,不能一直让程序在root权限下运行,否则会存在安全陷患,因此最好能把权限降下来。下面是个例子:
    1. http.createServer(callback).listen(80, function () {
    2. var env = process.env,
    3. uid = parseInt(env[‘SUDO_UID‘] || process.getuid(), 10),
    4. gid = parseInt(env[‘SUDO_GID‘] || process.getgid(), 10);
    5. process.setgid(gid);
    6. process.setuid(uid);
    7. });

    上例中有几点需要注意:

    • 如果是通过sudo获取root权限的,运行程序的用户的UID和GID保存在环境变量SUDO_UID和SUDO_GID里边。如果是通过chmod +s方式获取root权限的,运行程序的用户的UID和GID可直接通过process.getuid和process.getgid方法获取。
    • process.setuid和process.setgid方法只接受number类型的参数。
    • 降权时必须先降GID再降UID,否则顺序反过来的话就没权限更改程序的GID了。

5.创建子进程:
var child = child_process.spawn(‘node‘, [ ‘xxx.js‘ ]);//第一个参数是执行文件路径,可以是执行文件的相对或绝对路径,也可以是根据PATH环境变量能找到的执行文件名。第二个参数中,数组中的每个成员都按顺序对应一个命令行参数。第三个参数可选,用于配置子进程的执行环境与行为。

  1. child.stdout.on(‘data‘, function (data) {
  2. console.log(‘stdout: ‘ + data);
  3. });
  4. child.stderr.on(‘data‘, function (data) {
  5. console.log(‘stderr: ‘ + data);
  6. });
  7. child.on(‘close‘, function (code) {
  8. console.log(‘child process exited with code ‘ + code);
  9. });

另外,上例中虽然通过子进程对象的.stdout和.stderr访问子进程的输出,但通过options.stdio字段的不同配置,可以将子进程的输入输出重定向到任何数据流上,或者让子进程共享父进程的标准输入输出流,或者直接忽略子进程的输入输出。

  1. 进程间的通讯

在linux下,进程间通过信号相互通讯,例子如下:
/ parent.js /
var child = child_process.spawn(‘node‘, [ ‘child.js‘ ]);

  1. child.kill(‘SIGTERM‘);
  2. /* child.js */
  3. process.on(‘SIGTERM‘, function () {
  4. cleanUp();
  5. process.exit(0);
  6. });

在上例中,父进程通过.kill方法向子进程发送SIGTERM信号,子进程监听process对象的SIGTERM事件响应信号。不要被.kill方法的名称迷惑了,该方法本质上是用来给进程发送信号的,进程收到信号后具体要做啥,完全取决于信号的种类和进程自身的代码。

在NodeJS中,如果爷子进程都是NodeJS进程,就可以通过IPC(进程间通讯)双向传输数据:
/ parent.js /
var child = child_process.spawn(‘node‘, [ ‘child.js‘ ], {
stdio: [ 0, 1, 2, ‘ipc‘ ]
});

  1. child.on(‘message‘, function (msg) {
  2. console.log(msg);
  3. });
  4. child.send({ hello: ‘hello‘ });
  5. /* child.js */
  6. process.on(‘message‘, function (msg) {
  7. msg.hello = msg.hello.toUpperCase();
  8. process.send(msg);
  9. });

可以看到,父进程在创建子进程时,在options.stdio字段中通过ipc开启了一条IPC通道,之后就可以监听子进程对象的message事件接收来自子进程的消息,并通过.send方法给子进程发送消息。在子进程这边,可以在process对象上监听message事件接收来自父进程的消息,并通过.send方法向父进程发送消息。数据在传递过程中,会先在发送端使用JSON.stringify方法序列化,再在接收端使用JSON.parse方法反序列化。

  1. 如何守护子进程:守护进程一般用于监控工作进程的运行状态,在工作进程不正常退出时重启工作进程,保障工作进程不间断运行。

    1. /* daemon.js */
    2. function spawn(mainModule) {
    3. var worker = child_process.spawn(‘node‘, [ mainModule ]);
    4. worker.on(‘exit‘, function (code) {
    5. if (code !== 0) {
    6. spawn(mainModule);
    7. }
    8. });
    9. }
    10. spawn(‘worker.js‘);

    可以看到,工作进程非正常退出时,守护进程立即重启工作进程。

来自为知笔记(Wiz)

时间: 2025-01-03 01:13:22

windows下《七天学会NodeJS》学习笔记之四--网络操作的相关文章

nodejs学习笔记之网络编程

了解一下OSI七层模型 OSI层 功能 TCP/IP协议 应用层 文件传输,电子邮件,文件服务,虚拟终端  TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化,代码转换,数据加密 - 会话层 数据格式化,代码转换,数据加密 - 传输层 提供端对端的接口 TCP,UDP 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU 物理层  以二

Android学习笔记-Wifi网络操作

Wifi网卡状态 WIFI_STATE_DISABLED Wifi网卡不可用 WIFI_STATE_DIABLING Wifi网卡正在关闭 WIFI_STATE_ENABLED Wifi网卡可用 WIFI_STATE_ENABLING Wifi网卡正在打开 WIFI_STATE_UNKNOWN 未知网卡状态 操作Wifi网卡所需要的权限 CHANGE_NETWORK_STATE 改变网络连接状态 CHANGE_WIFI_STATE 改变Wifi连接状态 ACCESS_NETWORK_STATE

windows下《七天学会NodeJS》学习笔记之二--代码的组织和部署

本系列第一篇:<windows下<七天学会NodeJS>学习笔记之一--NodeJS基础>,请参见这儿:http://blog.csdn.net/fm2005/article/details/41348813 模块路径解析规则:nodejs支持三种解析方式:/或C:开头的绝对路径:./开头的绝对路径:按照一定规则解析路径,直到找到模块位置. 内置模块:如果传递给require的是NodeJS内置模块名称,则不解析,直接返回内部模块导出对象. node_modules目录:node_

nodejs学习笔记之安装、入门

由于项目需要,最近开始学习nodejs.在学习过程中,记录一些必要的操作和应该注意的点. 首先是如何安装nodejs环境?(我用的是windows 7环境,所以主要是windows 7的例子.如果想看linux下的安装可以参考http://www.cnblogs.com/meteoric_cry/archive/2013/01/04/2844481.html) 1. nodejs提供了一些安装程序,可以去官网(http://nodejs.org/download/)按照自己的机器进行下载,下载完

Nodejs学习笔记(三)——一张图看懂Nodejs建站

前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试Nodejs>之后,代码编写环境就从Sublime转战到Eclipse下,感觉顺手多了.于是就跟着Scott老师学起了Nodejs建站的课程(推荐大家点进去看看),踏上了未爬先走的路子. 作为一个白里透白的小白来说,今天主要记录下如何用Nodejs搭建一个小小的网站,以及自己对于这种Nodejs建站的运

今天读一读七天学会NodeJS

七天学会NODEJS NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTT

nodejs学习笔记(基于v7.4.0)

nodejs学习笔记 一.buffer: 全局对象(单例   Buffer.from   Buffer.alloc   Buffer.allocUnsafe ) 编码类型 描述 ascii 仅仅用于7位ascall数据编码,速度快,如果设置了将会剥离高位 utf8 多字节的编码的Unicode字符,网页文档大部分默认都为它. utf16le 小端编码的Unicode字符,2或者4个字节 ucs2 utf16le的别名 base64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之

nodejs学习笔记_nodejs和PHP在基础架构上的差别--共享状态的并发

绝大多数对于Node.js的讨论都把关注点放在了处理高并发能力上,做开发的时候一定要明确node内部做出的权衡,以及node应用性能好的原因. node 为javascript引入了一个复杂的概念,:共享状态的并发. node採用一个长期执行的进程 而php在apache中会产生多个进程 例如以下图所看到的: 代码验证: PHP: <?php $i = 0; $i++; echo $i nodejs: var http = require('http'); var i=0; http.creat

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu