-
Notifications
You must be signed in to change notification settings - Fork 20
Description
概述
网络相关类的关系如下:
当然了,还有内部生成的:
- http.ClientRequest,该对象在 http.request() 内部被创建并返回。 它表示着一个正在处理的请求,其请求头已进入队列。
- http.ServerResponse,该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 'request' 事件。
- http.IncomingMessage,IncomingMessage 对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别递给 'request' 和 'response' 事件。
1. dgram
dgram模块提供了 UDP 数据包 socket 的实现。
事件:
- close,'close'事件将在使用close()关闭一个 socket 之后触发。
- error,当有任何错误发生时,'error'事件将被触发。
- listening,当一个 socket 开始监听数据包信息时,'listening'事件将被触发。
- 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,其中:
http.ClientRequest代表通信的客户端http.Server代表通信的服务端http.Agent是服务器的配置,表示服务器是否支持keepAlive、支持keepAlive多久、最多支持多少个socket/空闲socket、超时时间http.IncomingMessage代表一次通信的请求报文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协议特征。
关键类:
- Http2Session:Http2Session类实例表示一个通信双方建立的会话
- ServerHttp2Session
- ClientHttp2Session
- Http2Stream:Http2Stream类的每个实例表示会话上的通信流,一次通信包括请求报文和响应报文
- ClientHttp2Stream
- ServerHttp2Stream
- Http2Server,普通的http2
- Http2SecureServer,基于TSL/SSL的http2
虽然HTTP2协议并没有要求必须基于TSL/SSL,但是很多浏览器都不支持普通的http2
5.2 兼容API
为了兼容HTTP1,可以在创建HTTP2服务器的时候设置:allowHTTP1: true,可以参考ALPN negotiation
关键类:
- http2.Http2ServerRequest,表示请求对象
- http2.Http2ServerResponse,表示响应对象
