Net模块提供一个异步的网络API,这个API可以创建基于流的TCP,或者IPC服务器(net.createServer()),和客户端(net.createConnection())。
它可以这样访问:
const net = require('net');
IPC支持
net模块在Windows上支持命名管道IPC,在其它系统上支持UNIX域套接字。
为IPC链接识别路径
net.connect()、net.createConnection()、server.listen()和socket.connect()使用一个path参数去识别IPC端点。
在UNIX中,本地域名也称之为UNIX域。路径是一个文件系统路径。它被从sizeof(sockaddr_un.sun_path)-1出截断,根据不同的系统在91到107字节之间。在Linux上通常为107个字节,在macOS上为103个字节。路径同样要遵循命名规范,并且在创建文件时会检查权限。如果UNIX域socket(这里作为一个文件系统路径可见)被创建,并且使用Node.js的API抽象(比如net.createServer())做连接,它将作为server.close()的一部分断开连接。另一方面,如果是在这些抽象之外创建和使用,用户需要手动移除。着同样适用于在Node.js API创建路径的时候,程序突然崩溃的情况。总之,一旦UNIX域socket被创建之后将会一直在文件系统中存在,直到断开连接。
在Windows上,本地域名通过使用命名的管道实现。路径必须是以?pipe 或者 .pipe为入口。任意字符都是被允许的,但是后者要处理一些管道的名字,比如解析..序列。不管看起来怎么样,管道命名空间都是平面的。管道不会持久保存。当它们的最后一个引用被关闭的时候被移除。不像UNIX领域socket,Windows将关闭和移除管道,当拥有管道的进程退出时。
JavaScript字符串转义要求路径用双反斜线转义,例如:
net.createServer().listen(path.join('?pipe', process.cwd(), 'myctl'));
Class:net.Server
在v0.1.90添加
该类用于创建一个TCP或者IPC服务器。
new net.Server([options][,connectionlistener])
- options <Object> 参考 net.createServer([options][, connectionListener])。
- connectionListener <Function> 为’connection’事件自动设置一个监听器。
- 返回:<net.Server>
net.Server是一个拥有以下事件的EventEmitter:
Event:’close’
V0.5.0添加
server关闭的时候发射。注意如果链接存在,事件在所有链接没有结束的时候不会发射。
Event:’connection’
v0.1.90添加
- <net.Socket>
新建一个connection的时候发射。socket是net.Socket的实例。
Event:’error’
v0.1.90添加
- <Error>
一个错误发生时发射。不同于net.Socket,’close’事件不会再这个事件之后直接发射,而是手动调用server.close()之后发射。参考server.listen()中的讨论。
Event:’listening’
v0.1.90添加
server在调用server.listen()绑定后发射。
server.address()
v0.1.90
- 返回:<Object>|<string>
如果在一个IP socket上监听(当得到一个OS-指定的地址,用于查找分配了哪个端口),返回绑定的address、地址family名字、和操作系统报告的服务器的port:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }。
对于监听一个管道或者UNIX域socket的server,返回的名字是一个字符串。
const server = net.createServer((socket) => {socket.end('goodbyen');
}).on('error', (err) => {// handle errors herethrow err;
});// Grab an arbitrary unused port.
server.listen(() => {console.log('opened server on', server.address());
});
在’listening’事件未发射之前,不要调用server.address()。
server.close([callback])
v0.1.90添加
- callback <Function> 当server关闭的时候调用。
- 返回:<net.Server>
停止server接收新的链接和保持存在的链接。这个函数是异步的,server会在所有链接结束的时候关闭,并且发射一个’close’事件。callback会在’close’事件发生时调用。不同于其它事件,Error将会作为它的唯一参数被调用,如果server在关闭的并没有打开。
server.getConnections(callback)
v0.9.7添加
- callback <Function>
- 返回:<net.Server>
异步获得服务器上的并发链接数。当socket被传递到子进程时工作。
回调函数应该有两个参数err和count。
server.listen()
启动一个服务器监听链接。一个net.Server根据监听的内容可以是一个TCP,或者IPC服务器。
可能的参数:
- server.listen(handle[,backlog][,callback])
- server.listen(options[, callback])
- server.listen(path[,backlog][,callback]) 对于IPC服务器
- server.listen(port[[, host[, backlog]]][, callback])对于TCP服务器
这个函数是异步的。当服务器开始监听的时候,’listening’事件会被发射。最后一个callback参数会被添加,当为’listening’事件添加一个监听器时。
所有的listen()方法都可以通过一个backlog参数指定排队的等待链接数的最大值。实际的长度将会取决于OS的sysctl设置,例如Linux上是tcp_max_syn_backlog和somaxconn。这个参数的默认值是511。
所有的net.Socket都被设置为SO_REUSEADDR(参考socket(7)了解详细)。
当且仅当第一次调用server.listen()或者server.close()抛出一个错误的时候可以再次调用server.listen()。否则,会抛出一个ERR_SERVER_ALREADY_LISTEN错误。
最常见的一个错误是监听到EADDRINUSE。这是因为另一个服务正在监听请求的port/path/handle。一种处理这个情况的方法是过一段时间后重试:
server.on('error', (e) => {if (e.code === 'EADDRINUSE') {console.log('Address in use, retrying...');setTimeout(() => {server.close();server.listen(PORT, HOST);}, 1000);}
});
server.listen(handle[,backlog][,callback])
v0.5.10添加
- handle <Object>
- backlog <number> server.listen()函数的通用参数
- callback <Function> server.listen()函数的通用参数
- 返回:<net.Server>
启动一个服务器,在给定的handle上监听链接,这个handle已经被绑定到一个端口、一个UNIX域socket、或者一个Windows的管道。
handle对象可以是一个服务器、一个socket(任何拥有底层_handle成员的东西),或者拥有fd成员(一个有效的文件描述符)的对象。
Windows上不支持监听一个文件描述符。
server.listen(options[,callback])
v11.4.0 支持ipv6Only选项
在v0.11.14版本添加
- options<Object>必须的。支持以下属性:
- Port <number>
- Host <string>
- Path <string> 如果指定了端口将会忽略。参考《为IPC链接识别路径》
- backlog <number> server.listen()函数的通用参数。
- Exclusive <boolean> 默认:false
- readableAll<boolean> 对于IPC服务器,它让管道被所有用户可读。默认:false
- writableAll<boolean>对于IPC服务器,它让管道被所有用户可写。默认:false
- ipv6Only <boolean> 对于TCP服务器,设置ipv6Only设置为true,将会使双协议栈不可用。也就是,绑定::到主机,不会使0.0.0.0被绑定。默认:false。
- Callback <Function> server.listen()的通用函数。
- 返回: <net.Server>
如果指定了port,它的作用和server.listen([port[, host[, backlog]]][, callback])一样。否则,如果path被指定,它的作用跟server.listen(path[, backlog][, callback])。如果都没有指定,则会抛出错误。
如果exclusive是false(默认),则cluster workers都会使用相同的底层句柄,允许链接处理责任分享(?)。当exclusive是true,句柄不会被分享,企图分享端口会报错。下面的例子是监听一个独享端口的代码。
server.listen({host: 'localhost',port: 80,exclusive: true
});
使用一个IPC服务器作为root,可能导致没有特权的用户无法访问服务器路径。使用readableAll和writableAll可以使服务器对所有用户可访问。
server.listen(path[,backlog][,callback])
在v0.1.90添加
- Path <string> 服务器应该监听的路径。参考《为IPC链接识别路径》
- backlog <number> server.listen()函数的通用参数。
- Callback <Function> server.listen()的通用函数。
- 返回:<net.Server>
启动一个IPC服务器监听给定的path的链接。
server.listen([port[,host[,backlog]]][,callback])
在v0.1.90添加
- Port <number>
- Host <string>
- Backlog <number> server.listen()函数的通用参数。
- callback<Function> server.listen()函数的通用参数。
- 返回:<net.Server>
启动一个TCP服务器监听给定的port和host的链接。
如果port被忽略,或者是0,则操作系统会任意分配一个未使用的端口,在发射’listening’事件发射之后,可以使用server.address().port重新设置。
如果host被忽略,如果IPv6可见,则接收在unspecified IPv6 address(::)上的链接,或者unspecified IPv4 address0:0:0:0)。
在大多数操作系统上,监听unspecified IPv6 address (::)可能会导致net.Server同样监听unspecified IPv4 address (0.0.0.0)。
server.listening
在v5.7.0添加
- <boolean> 表明服务器是否在监听链接。
server.maxConnections
在v0.2.0添加
设置这个属性,当服务器的链接数过高的时候丢弃链接。
一旦一个socket使用child_process.fork()被传递到一个子进程,则不推荐使用这个选项。
server.ref()
在v0.9.1添加
- 返回:<net.Server>
跟unref()相反,在之前unref过的服务器上调用ref(),如果这是唯一存留的服务器,将不会使程序退出(默认行为)。如果已经ref的服务器再次调用ref(),则不会有作用。
server.unref()
在v0.9.1添加
- 返回:<net.Server>
如果这个server是事件系统中唯一有效的,则调用unref()会允许程序退出。如果已经unref的服务器再次调用unref(),则不会有作用。
Class:net.Socket
在0.3.4添加
这个类是TCP socket,或者是流IPC端点(在Windows中名字是管道,UNIX用的是领域socket)的抽象类。net.Socket是一个双工流,所以它可读可写,它同样是一个EventEmitter。
用户可以创建一个net.Socket,并且可以直接跟一个服务器交互。例如:它由net.createConnection(),所以用户可以跟服务器通讯。
Node.js同样可以创建一个,并且在接收到链接时传递给用户。例如,它被传递给在一个net.Server发射的‘connection’事件的监听器上,所以用户可以用它跟客户端交流。
new net.Socket([options])
v0.3.4添加
- options <Object> 可见的选项如下:
- fd <number> 如果指定了该参数,则使用给定的文件描述符包装已存在的socket,否则会创建一个新的socket。
- allowHalfOpen <boolean> 表明是否允许half-opened TCP 链接。参考net.createServer()和'end'事件了解详细。默认:false。
- readable <boolean> 当传了fd之后允许在socket上读,否则忽略。默认:false。
- writable <boolean> 当传了fd之后允许在socket上写,否则忽略。默认:false。
- 返回:<net.Socket>
创建一个新的socket对象。
新创建的socket可以是一个TCP socket,也可以是一个流IPC端点,这取决于它connect()[socket.connect()]什么。
Event: 'close'
在v0.1.90添加
- hadError <boolean> true 如果socket有一个传送错误。
在socket完全关闭以后发射。hadError参数是一个布尔值,它表示socket是否是因为传输错误导致的关闭。
Event: 'connect'
在v0.1.90添加
当一个socket链接完全建立之后发射。参考net.createConnection()。
Event: 'data'
在v0.1.90添加
- <Buffer> | <string>
当数据收到的时候发射。参数data将会是一个Buffer,或者String。socket.setEncoding()设置数据编码。
注意,如果当一个Socket发射一个'data'事件的时候没有监听者,数据会丢失。
Event:'drain'
在v0.1.90添加
当写缓存变空的时候发射。可以用来上传节流。
参考:socket.write()的返回值。
Event:'end'
在v0.1.90添加
当socket的另一端发送一个FIN包的时候发射,因此结束socket的可读的一端。
默认(allowHalfOpen是false),socket将会发送一个FIN包返回,并且一旦写入它的等待队列,就销毁它的文件描述符。然而,如果allowHalfOpen被设置为true,socket不会自动end()它的可写端,允许用户写任意数量的数据。用户必须显示的调用end()去结束链接(也就是发送一个FIN包返回)。
Event: 'error'
在v0.1.90添加
- <Error>
当一个错误发生时发射。在这个事件之后'close'事件会被调用。
Event: 'lookup'
v5.10.0 支持host参数。
v0.11.3 添加
在连接之前解析主机之后发射。不适用于UNIX socket。
- err <Error> | <null> error对象。参看dns.lookup()。
- address <string> IP地址
- family <string> | <null> 地址类型。参看dns.lookup()。
- host <string> 主机名称。
Event: 'ready'
在v9.11.0添加
当一个socket准备好被使用时发射。
在'connect'之后触发。
Event:'timeout'
在v0.1.90添加
不活动的socket超时时发射。这只能提示socket是空闲状态。用户必须手动关闭链接。
参考:socket.setTimeout()。
socket.address()
在v0.1.90添加
- 返回:<Object>
返回绑定的address、地址的family名字和操作系统报告的socket的port:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
socket.bufferSize
在v0.3.8添加
net.Socket拥有socket.write()一直工作的属性。这帮助用户快速启动和运行。计算机不能总是赶得上写入一个socket的数据量——网络链接只是可能太慢了。Node.js需要内部排队数据写入一个socket,并且在可能的时候发送出去。(内部轮询socket的文件描述符是可写的)。
内部缓存的后果是导致内存上升。这个属性显示要写入的字符的数量。(字符的数量大约跟要写入的字节的数量一致,但是缓存中可能包含字符串(字符串是lazily编码的),所以具体的字节数不确定)
有经验的用户在处理大的,或者增长的bufferSize应该在他的程序中使用socket.pause()和socket.resume()节流数据。
socket.bytesRead
在v0.5.3添加
接收到的字节的数量
socket.bytesWritten
在v0.5.3添加
发送的字节数
socket.connect()
在给定的socket上创建一个链接。
可能的样本:
- socket.connect(options[,connectListener])
- socket.connect(path[,connectListener]) 对于IPC链接。
- socket.connect(port[,host][,connectListener])对于TCP链接。
- 返回:<net.Socket>socket本身。
这个函数是异步的。当链接建立时,'connect'事件将会被发射。如果这是一个有问题的连接,则不会发射'connect'事件,而是会发射'error'事件并且把错误传递给'error'监听者。最后的参数connectListener(如果一旦指定了),将会被当做'connect'事件的监听者。
socket.connection(options[,connectListener])
v6.0.0 在所有情况下hints选项都默认为0。之前,在缺少family选项时,它默认为dns.ADDRCONFIG | dns.V4MAPPED。
v5.11.0 支持hints选项。
v0.1.90 添加
- options <Object>
- connectListener <Function> socket.connect()方法的通用参数。将会被添加为'connect'事件的监听者。
- 返回:<net.Socket> socket本身。
在给定的socket上创建一个链接。通常这个方法是不需要的,socket应该通过net.createConnection()创建和打开。只有在自定义一个Socket的时候需要这个方法。
对于TCP链接,可见的options有:
- port <number> 需要。socket应该连接的端口。
- host <string> socket需要连接的主机。默认:'localhost'。
- localAddress <string> socket应该连接的本地地址。
- localPort <number> socket应该连接的本地端口。
- family <number> IP协议的版本,可以是4或者6。默认:4。
- hints <number> 可选择的 dns.lookup() 提示。
- lookup <Function> 自定义查找方法。默认:dns.lookup()。
对于IPC链接,可见的options是:
- path <string> 需要。客户端需要连接的路径。参考<为IPC链接识别路径>。
socket.connect(path[,connectListener])
- path <string> 客户端应该连接的路径。参考<为IPC链接识别路径>。
- connectListener <Function> socket.connect()方法的通用参数。将会被添加为'connect'事件的监听者。
- 返回:<net.Socket> socket本身。
相当于用{ path: path}当做options调用socket.connect(options[,connectListener])。
socket.connect(port[,host][,connectlistener])
在v0.1.90添加
- port <number> 客户端应该连接的端口。
- host <string> 客户端t需要连接的主机。
- connectListener <Function> socket.connect()方法的通用参数。将会被添加为'connect'事件的监听者。
- 返回:<net.Socket> socket本身。
在给定的socket上创建一个链接。
相当于用{port: port, host: host}当做options调用socket.connect(options[,connectListener])。
socket.connecting
在v6.1.0添加
如果是true,表示调用了socket.connect(options[, connectListener])并且函数还在执行。直到socket连接上还是true,然后设置为false,并且发射'connect'事件。注意,socket.connect(options[,connectListener])回调是'connect'事件的监听者。
socket.destroy([exception])
在v0.1.90添加
- exception <Object>
- 返回: <net.Socket>
确保没有多余的I/O活动在这个socket中。只有必要的错误(解析错误或者其它)。
如果指定了exception,则当一个'error'事件发射的时候,任何该事件的监听者都会收到exception参数。
socket.destroyed
- <boolean> 表示链接是否被销毁了。一旦链接被销毁了,则不会有数据用它来传送。
socket.end([data][,encoding][,callback])
在v0.1.90添加
- data <string> | <Buffer> | <Uint8Array>
- encoding <string> Only used when data is string. 默认:'utf8'。
- callback <Function> 当socket完成是的可选回调函数。
- 返回:<net.Socket> socket本身。
半关闭socket。也就是,发送一个FIN包。如果可能,服务器仍然会发送一些数据。
如果指定了data,相当于调用socket.write(data, encoding)之后接着调用socket.end()。
socket.localAddress
在v0.9.6添加
字符串代表了远程客户端连接的本地IP地址。例如,一个服务器监听'0.0.0.0',如果一个客户端连接'192.168.1.1',则socket.localAddress将会是'192.168.1.1'。
socket.localPort
在v0.9.6添加
这个数字代表本地端口。例如,80或者21。
socket.pause()
- 返回: <net.Socket> socket本身。
暂停读取数据。就是'data'事件将不会发射。用户减慢上传的速度。
socket.pending
在v11.2.0添加
- <boolean>
如果是true则表示socket还没有连接,或者因为.connect()还没有被调用到,或者还在连接的过程中(参考socket.connecting)。
socket.ref()
在v0.9.1
- 返回:<net.Socket> socket本身。
unref的反面,在之前调用过unref的socket上面调用ref(),如果这是仅存的socket,则不会让程序退出(默认行为)。如果socket已经调用过ref,则再次调用没有效果。
socket.remoteAddress
在v0.5.10添加
字符串代表远程IP地址。例如,'74.125.127.100' 或者 '2001:4860:a005::68'。如果socket被销毁(例如,如果客户端断开连接)则数值是undefined。
socket.remoteFamily
在v0.5.10添加
字符串代表远程IP协议族。'IPv4',或者'IPv6'。
socket.remotePort
在v0.5.10添加
这个数字代表远程端口。例如,80或者21。
socket.resume()
- 返回:<net.Socket> socket本身。
在调用socket.pause()之后恢复读。
socket.setEncoding([encoding])
在v0.1.90添加
- encoding <string>
- 返回:<net.Socket> socket本身。
为Readable Stream设置编码。参考readable.setEncoding()或者更多信息。
socket.setKeepAlive([enable][,initialdelay])
在v0.1.92添加
- enable<boolean> 默认:false
- initialDelay <number> 默认:0
- 返回:<net.Socket> socket本身。
启动/禁止长连接功能,在第一个长连接探针被发送到一个空闲socket之前设置任意初始延迟。
设置initialDelay(毫秒)设置延迟,在收到最后一个数据包和第一个长连接探针之间。initialDelay设置0,将会保持默认值不变。
socket.setNoDelay([noDelay])
在v0.1.90添加
- noDelay <boolean> 默认:true
- 返回:<net.Socket> socket本身。
禁止Nagle算法。默认TCP链接会使用Nagle算法,在发送数据之前会缓存数据。把noDelay设置为true,将会在每次调用socket.write()之后立即发送数据。
socket.setTimeout(timeout[,callback])
在v0.1.90添加
- timeout <number>
- callback <Function>
- 返回: <net.Socket> socket本身。
设置socket超时在timeout毫秒不活动之后。默认:net.Socket没有超时。
当一个闲置的超时被触发,socket会收到一个'timeout'事件,但是连接不会被断开。用户需要手动调用socket.end(),或者socket.destroy()去结束连接。
socket.setTimeout(3000);
socket.on('timeout', () => {console.log('socket timeout');socket.end();
});
如果timeout是0,则现有的闲置超时被禁止。
可选择的callback参数对于'timeout'事件,将会被当做一个以前的监听者。[The optional callback parameter will be added as a one-time listener for the 'timeout' event.]
socket.unref()
在v0.9.1添加
- 返回:<net.Socket> socket本身。
在一个socket上调用unref(),则如果这是在事件系统中唯一的活动socket,则允许程序退出。如果socket已经调用过unref,则再次调用没有效果。
socket.write(data[,encoding][,callback])
在v0.1.90添加
- data <string> | <Buffer> | <Uint8Array>
- encoding <string> 只有在数据是string的时候使用。默认:utf8。
- callback <Function>
- 返回:<boolean>
在socket上发送数据。第二个参数在是字符串的时候指定编码——默认UTF8。
如果所有的数据都刷新到内部缓存则返回true。如果数据在用户内存中排队则返回false。但缓存再次空闲时发射'drain'事件。
可选用的参数callback将会被执行,在数据最终被写出之后——这个可能不会立即执行。
参考Writable流的write()方法获得更多信息。
net.connect()
net.createConnection()的别名。
可能的样本:
- net.connect(options[,connectListener])
- net.connect(path[,connectListener]) 对于IPC链接。
- net.connect(port[,host][,connectListener])对于TCP链接。
net.connect(options[,connectListener])
在v0.7.0添加
- options <Object>
- connectListener <Function>
net.createConnection(options[,connectListener])的别名。
net.connect(path[,connectListener])
在v0.1.90添加
- path <string>
- connectListener <Function>
net.createConnection(path[,connectListener])的别名
net.connect(port[,host][,connectlistener])
在v0.1.90添加
- port<number>
- host<string>
- connectListener <Function>
net.createConnection(port[,host][,connectListener])的别名。
net.createConnection()
一个工厂函数,它创建一个新的net.Socket,立即通过socket.connect()启动连接,然后返回启动连接的net.Socket。
当链接建立,在返回的socket上会发送一个'connect'事件。如果提供了最后一个connectListener参数,它将会被当做'connect'事件的监听者。
可能的样本:
- net.createConnection(options[,connectListener])
- net.createConnection(path[, connectListener])对于IPC链接。
- net.createConnection(port[,host][,connectListener])对于TCP链接。
net.connect()函数是这个函数的别名。
net.createConnection(options[,connectListener])
在v0.1.90添加
- options <Object> 需要。将会同时传递给new netSocket([options])调用和socket.connect(options[,connectListener])方法。
- connectListener <Function> net.createConnection()函数的通用参数。如果提拱了,将会被当做返回的socket的'connnect'事件的监听者。
- 返回: <net.Socket> 新创建的socket需要启动链接。
可见的选项为:参考new net.Socket([options])和socket.connect(options[,connectListener])。
附加选项:
- timeout <number> 如果设置了,会在socket创建之后,但是它启动连接之前,将会用来调用socket.setTimeout(timeout)。
下面是在net.createServer()章节描述的客户端服务器的例子:
const net = require('net');
const client = net.createConnection({ port: 8124 }, () => {// 'connect' listenerconsole.log('connected to server!');client.write('world!rn');
});
client.on('data', (data) => {console.log(data.toString());client.end();
});
client.on('end', () => {console.log('disconnected from server');
});
想要连接到socket /tmp/echo.sock,只需要将第二行改为:
const client = net.createConnection({ path: '/tmp/echo.sock' });
net.createConnect(path[,connectListener])
在v0.1.90添加
- path <string> socket需要连接的路径。将会传递给socket.connect(path[,connectListener])。参考<为IPC链接识别路径>
- connectListener <Function> net.createConnection()的通用参数,在初始化socket的时候的"一次"监听器。将会传递给socket.connect(path[,connectListener])。
- 返回:<net.Socket> 新创建的socket需要启动连接。
初始化一个IPC连接。
这个函数用所有默认选项创建一个新net.Socket,立即通过socket.connect(path[,connectListener])启动连接,然后返回net.Socket启动连接。
net.createConnect(port[,host][,connectlistener])
在v0.1.90添加
- port<number> socket需要连接的端口。将会传递给socket.connect(port[,host][,connectListener])。
- host<string> socket需要连接的主机。将会传递给socket.connect(port[,host][,connectListener])。默认:'localhost'。
- connectListener <Function> net.createConnection()的通用参数,在初始化socket的时候的"一次"监听器。将会传递给socket.connect(path[,connectListener])。
- 返回:<net.Socket> 新创建的socket需要启动连接。
初始化一个TCP连接。
这个函数用所有默认选项创建一个新net.Socket,立即通过socket.connect(port[,host][,connectListener])启动连接,然后返回net.Socket启动连接。
net.createServer([options][,connectionlistener])
在v0.5.0添加
- options <Object>
- allowHalfOpen <boolean> 表明是否允许半开的TCP链接。默认:false。
- pauseOnConnect <boolean> 表明是否应该在传入链接上暂停socket。默认:false。
- connectionListener <Function> 自动为'connection'事件设置一个监听者。
- 返回:<net.Server>
创建一个新的TCP,或者IPC服务器。
如果allowHalfOpen设置为true,当socket的另一端发送一个FIN包时,当明确调用socket.end()时服务器将只会发送一个FIN包返回,直到那时链接是半关闭(不可读但是可写)。参考'end'事件和FRC 1122(4.2.2.13章)获得更多信息。
如果pauseOnConnect设置为true,则每个传入的链接关联的socket都将暂停,并且从他的句柄里面读不到任何数据。这允许链接在进程间传递,并且原始进程不读取任何数据。开始从暂停的socket中读取数据,调用socket.resume()。
服务器可以是一个TCP服务器,或者一个IPC服务器,取决于listen()什么。
下面是一个TCP回声服务器的例子,它监听的是8124端口:
const net = require('net');
const server = net.createServer((c) => {// 'connection' listenerconsole.log('client connected');c.on('end', () => {console.log('client disconnected');});c.write('hellorn');c.pipe(c);
});
server.on('error', (err) => {throw err;
});
server.listen(8124, () => {console.log('server bound');
});
使用telnet测试它:
$ telnet localhost 8124
要监听在socket的/tmp/echo.sock上,最后三行应该改为:
server.listen('/tmp/echo.sock', () => {console.log('server bound');
});
使用nc去连接到一个UNIX域socket服务器上:
$ nc -U /tmp/echo.sock
net.isIP(input)
在v0.3.0添加
- input <string>
- 返回: <integer>
检查输入是否是一个IP地址。返回0表示无效字符串,返回4表示IP的版本是4,返回6表示IP的版本是6。
net.isIPv4(input)
在v0.3.0添加
- input <string>
- 返回: <boolean>
如果输入的地址是IPv4则返回true,否则返回false。
net.isIPv6(input)
在v0.3.0添加
- input <string>
- 返回: <boolean>
如果输入的地址是IPv6则返回true,否则返回false。