Skip to content

NodeJS 网络模块 #50

@coconilu

Description

@coconilu

概述

网络相关类的关系如下:

nodejs

当然了,还有内部生成的:

  1. http.ClientRequest,该对象在 http.request() 内部被创建并返回。 它表示着一个正在处理的请求,其请求头已进入队列。
  2. http.ServerResponse,该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 'request' 事件。
  3. http.IncomingMessage,IncomingMessage 对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别递给 'request' 和 'response' 事件。

1. dgram

dgram模块提供了 UDP 数据包 socket 的实现。
事件:

  1. close,'close'事件将在使用close()关闭一个 socket 之后触发。
  2. error,当有任何错误发生时,'error'事件将被触发。
  3. listening,当一个 socket 开始监听数据包信息时,'listening'事件将被触发。
  4. message,当有新的数据包被 socket 接收时,'message'事件会被触发。

api:

dgram.createSocket(options[, callback]),创建一个 dgram.Socket 对象. 一旦创建了套接字,调用 socket.bind() 会指示套接字开始监听数据报消息。
dgram.createSocket(type[, callback]),同上。

socket.addMembership(multicastAddress[, multicastInterface])
socket.address(),返回一个包含 socket 地址信息的对象。
socket.bind([port][, address][, callback]),对于 UDP socket,该方法会令dgram.Socket在指定的port和可选的address上监听数据包信息。
socket.bind(options[, callback]),对于 UDP socket,该方法会令dgram.Socket在指定的port和可选的address上监听数据包信息。
socket.close([callback]),关闭该 socket 并停止监听其上的数据。
socket.dropMembership(multicastAddress[, multicastInterface])
socket.getRecvBufferSize(),socket 接收到的字节大小。
socket.getSendBufferSize(),socket 发送的字节大小。
socket.ref(),默认情况下,绑定一个 socket 会在 socket 运行时阻止 Node.js 进程退出。socket.unref() 方法用于将 socket 从维持 Node.js 进程的引用列表中解除。 socket.ref() 方法用于将 socket 重新添加到这个引用列表中,并恢复其默认行为。
socket.send(msg, [offset, length,] port [, address] [, callback]),msg参数包含了要发送的消息。
socket.setBroadcast(flag),设置或清除 SO_BROADCAST socket 选项。
socket.setMulticastInterface(multicastInterface)
socket.setMulticastLoopback(flag)
socket.setMulticastTTL(ttl),设置IP_MULTICAST_TTL套接字选项。
socket.setRecvBufferSize(size),设置 SO_RCVBUF 套接字选项。设置最大的套接字接收缓冲字节。
socket.setSendBufferSize(size),设置 SO_SNDBUF 套接字选项。设置最大的套接字发送缓冲字节。
socket.setTTL(ttl),设置 IP_TTL 套接字选项。 
socket.unref(),参考socket.ref()

2. net

net 模块提供了创建基于流的 TCP 或 IPC 服务器(net.createServer())和客户端(net.createConnection()) 的异步网络 API。

API:

net.connect()
net.createConnection(options[, connectListener]),一个用于创建 net.Socket 的工厂函数,立即使用 socket.connect() 初始化链接,然后返回启动连接的 net.Socket。
net.createConnection(path[, connectListener]),同上。
net.createConnection(port[, host][, connectListener]),同上。
net.createServer([options][, connectionListener]),创建一个新的TCP或IPC server。
net.isIP(input),测试 input 是否是 IP 地址。
net.isIPv4(input),如果 input 是 IPv4 地址则返回 true,否则返回 false。
net.isIPv6(input),如果 input 是 IPv6 地址则返回 true,否则返回 false。

2.1. net.server

这个类用于创建 TCP 或 IPC server。
事件:

close,当server关闭的时候触发。
connection,当一个新的connection建立的时候触发。
error,当错误出现的时候触发。
listening,当服务被绑定后触发。

API:

server.address(),如果在IP socket上监听,则返回绑定的ip地址,一个有 port, family, 和 address 属性: { port: 12346, family: 'IPv4', address: '127.0.0.1' }的对象。
server.close([callback]),停止 server接受建立新的connections并保持已经存在的connections。
server.getConnections(callback),异步获取服务器的当前并发连接数。当 socket 被传递给子进程时工作。
server.listen(handle[, backlog][, callback]),为 connections 启动一个 server 监听. 一个 net.Server 可以是一个 TCP 或者 一个 IPC server,这取决于它监听什么。
server.listen(options[, callback]),同上。
server.listen(path[, backlog][, callback]),同上。
server.listen([port[, host[, backlog]]][, callback]),同上。
server.listening,一个布尔值, 表明 server 是否正在监听连接。
server.maxConnections,设置该属性使得当 server 连接数过多时拒绝连接。
server.ref()
server.unref()

2.2. net.Socket

这个类是 TCP 或 UNIX Socket 的抽象(在Windows上使用命名管道,而UNIX使用域套接字)。net.Socket 实例实现了一个双工流接口。 他们可以在用户创建客户端(使用 connect())时使用, 或者由 Node 创建它们,并通过 connection 服务器事件传递给用户。
事件:

close,一旦 socket 完全关闭就发出该事件。
connect,当一个 socket 连接成功建立的时候触发该事件。 
data,当接收到数据的时触发该事件。
drain,当写入缓冲区变为空时触发。可以用来做上传节流。
end,当 socket 的另一端发送一个 FIN 包的时候触发,从而结束 socket 的可读端。
error,当错误发生时触发。
lookup,在找到主机之后创建连接之前触发。
timeout,当 socket 超时的时候触发。该事件只是用来通知 socket 已经闲置。

API:

socket.address()
socket.bufferSize,net.Socket 具有该属性,socket.write() 工作时需要。
socket.bytesRead,接收的字节数量。
socket.bytesWritten,发送的字节数量。
socket.connect(options[, connectListener])
socket.connect(path[, connectListener])
socket.connect(port[, host][, connectListener])
socket.connecting
socket.destroy([exception]),确保在该 socket 上不再有 I/O 活动。
socket.destroyed,一个布尔值,用来指示连接是否已经被销毁。
socket.end([data][, encoding]),半关闭 socket。例如发送一个 FIN 包。服务端仍可以发送数据。
socket.localAddress,远程客户端连接的本地 IP 地址字符串。
socket.localPort,用数字表示的本地端口。
socket.pause(),暂停读写数据。
socket.ref()
socket.remoteAddress,用字符串表示的远程 IP 地址。
socket.remoteFamily,用字符串表示的远程 IP 协议族。
socket.remotePort,用数字表示的远程端口。
socket.resume(),在调用 socket.pause() 之后恢复读取数据。
socket.setEncoding([encoding]),设置作为可读流(Readable Stream)的编码。
socket.setKeepAlive([enable][, initialDelay]),启用/禁用长连接功能, 并且在第一个长连接探针被发送到一个空闲的 socket 之前可选则配置初始延迟。
socket.setNoDelay([noDelay]),禁止 Nagle 。默认情况下 TCP 连接使用 Nagle 算法,在发送之前缓冲数据。将 noDelay 设置为 true 将会在每次 socket.write() 被调用的时候立即发送数据。noDelay默认是 true。
socket.setTimeout(timeout[, callback]),当 socket 在 timeout 毫秒不活动之后将其设置为超时状态。
socket.unref()
socket.write(data[, encoding][, callback]),在 socket 上发送数据。第二个参数制定了字符串的编码 - 默认是 UTF8 编码。

3. http

要使用 HTTP 服务器与客户端,需要 require('http')。

http模块是对HTTP协议的描述,简化了使用方式。包括通信的双方的API,其中:

  1. http.ClientRequest代表通信的客户端
  2. http.Server代表通信的服务端
  3. http.Agent是服务器的配置,表示服务器是否支持keepAlive、支持keepAlive多久、最多支持多少个socket/空闲socket、超时时间
  4. http.IncomingMessage代表一次通信的请求报文
  5. http.ServerResponse代表一次通信的响应报文

3.1. http.Agent

Agent 负责为 HTTP 客户端管理连接的持续与复用。

API:

new Agent([options])
agent.createConnection(options[, callback]),创建一个用于 HTTP 请求的 socket 或流。
agent.keepSocketAlive(socket)
agent.reuseSocket(socket, request)
agent.destroy()
agent.freeSockets
agent.getName(options)
agent.maxFreeSockets
agent.maxSockets
agent.requests
agent.sockets

3.2. http.ClientRequest

该对象在 http.request() 内部被创建并返回。 它表示着一个正在处理的请求,其请求头已进入队列。 请求头仍可使用 setHeader(name, value)、getHeader(name) 和 removeHeader(name) API 进行修改。 实际的请求头会与第一个数据块一起发送或当调用 request.end() 时发送。

事件:

abort
connect
continue
information
response
socket
timeout
upgrade

API:

request.abort(),标记请求为终止。
request.aborted
request.connection
request.end([data[, encoding]][, callback]),结束发送请求。 如果部分请求主体还未被发送,则会刷新它们到流中。 如果请求是分块的,则会发送终止字符 '0\r\n\r\n'。
request.flushHeaders()
request.getHeader(name)
request.maxHeadersCount
request.removeHeader(name)
request.setHeader(name, value)
request.setNoDelay([noDelay])
request.setSocketKeepAlive([enable][, initialDelay])
request.setTimeout(timeout[, callback])
request.socket
request.write(chunk[, encoding][, callback]),发送请求主体的一个数据块。 通过多次调用该方法,一个请求主体可被发送到一个服务器,在这种情况下,当创建请求时,建议使用 ['Transfer-Encoding', 'chunked'] 请求头。

3.3. http.Server

该类继承自 net.Server。
事件:

checkContinue
checkExpectation
clientError
close
connect,每当客户端发送 HTTP CONNECT 请求时触发。
connection,当新的 TCP 流被建立时触发。
request,每次接收到一个请求时触发。 
upgrade

API:

server.close([callback])
server.listen(),开启HTTP服务器监听连接。
server.listening
server.maxHeadersCount
server.setTimeout([msecs][, callback])
server.timeout
server.keepAliveTimeout

3.4. http.ServerResponse

该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 'request' 事件。

3.5. http.IncomingMessage

IncomingMessage 对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别递给 'request' 和 'response' 事件。 它可以用来访问响应状态、消息头、以及数据。

3.6. http.METHODS

返回解析器支持的 HTTP 方法的列表。

3.7. http.STATUS_CODES

返回标准的 HTTP 响应状态码的集合,以及各自的简短描述。

3.8. http.createServer([options][, requestListener])

返回一个新的 http.Server实例。

3.9. http.get(options[, callback])

因为大多数请求都是 GET 请求且不带请求主体,所以 Node.js 提供了该便捷方法。 该方法与 http.request() 唯一的区别是它设置请求方法为 GET 且自动调用 req.end()。 返回一个 http.ClientRequest 类的实例。

callback 被调用时只传入一个参数,该参数是 http.IncomingMessage 的一个实例。

3.10. http.globalAgent

Agent 的全局实例,作为所有 HTTP 客户端请求的默认 Agent。

3.11. http.request(options[, callback])

Node.js 为每台服务器维护多个连接来进行 HTTP 请求。 该函数允许显式地发出请求。

4. https

我们都知道HTTPS是建立在TLS/SSL之上的HTTP。在NodeJS中,它被分成另外一个模块,但是它的API和http模块几乎一样,只是用法有些差别,比如在创建https服务器的时候需要注入key和cert,来一段官网例子:

// curl -k https://localhost:8000/
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(8000);

5. http2

http2模块提供了对HTTP2协议的实现。

5.1 核心API

提供了更底层的接口来支持HTTP/2协议特征。

关键类:

  1. Http2Session:Http2Session类实例表示一个通信双方建立的会话
  2. ServerHttp2Session
  3. ClientHttp2Session
  4. Http2Stream:Http2Stream类的每个实例表示会话上的通信流,一次通信包括请求报文和响应报文
  5. ClientHttp2Stream
  6. ServerHttp2Stream
  7. Http2Server,普通的http2
  8. Http2SecureServer,基于TSL/SSL的http2

虽然HTTP2协议并没有要求必须基于TSL/SSL,但是很多浏览器都不支持普通的http2

5.2 兼容API

为了兼容HTTP1,可以在创建HTTP2服务器的时候设置:allowHTTP1: true,可以参考ALPN negotiation

关键类:

  1. http2.Http2ServerRequest,表示请求对象
  2. http2.Http2ServerResponse,表示响应对象

参考

Node.js Net 模块

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions