穩定性: 3 - 穩定
net
模塊提供了異步網絡封裝,它包含了創建服務器/客戶端的方法(調用 streams)。可以通過調用 require('net')
包含這個模塊。
創建一個 TCP 服務器。參數 connectionListener
自動給 'connection' 事件創建監聽器。
options
包含有以下默認值:
{
allowHalfOpen: false,
pauseOnConnect: false
}
如果 allowHalfOpen
= true
, 當另一端 socket 發送 FIN 包時 socket 不會自動發送 FIN 包。socket 變為不可讀,但仍可寫。你需要顯式的調用 end()
方法。更多信息參見 'end' 事件。
如果 pauseOnConnect
= true
,當連接到來的時候相關聯的 socket 將會暫停。它允許在初始進程不讀取數據情況下,讓連接在進程間傳遞。調用 resume()
從暫停的 socket 里讀取數據。
下面是一個監聽 8124 端口連接的應答服務器的例子:
var net = require('net');
var server = net.createServer(function(c) { //'connection' listener
console.log('client connected');
c.on('end', function() {
console.log('client disconnected');
});
c.write('hello\r\n');
c.pipe(c);
});
server.listen(8124, function() { //'listening' listener
console.log('server bound');
});
使用 telnet
來測試:
telnet localhost 8124
要監聽 socket t /tmp/echo.sock
,僅需要改倒數第三行代碼:
server.listen('/tmp/echo.sock', function() { //'listening' listener
使用 nc
連接到一個 UNIX domain socket 服務器:
nc -U /tmp/echo.sock必須
工廠方法,返回一個新的 'net.Socket',并連接到指定的地址和端口。
當 socket 建立的時候,將會觸發 'connect' 事件。
和'net.Socket'有相同的方法。
對于 TCP sockets,參數 options
因為下列參數的對象:
port
: 客戶端連接到 Port 的端口(必須)。
host
: 客戶端要連接到得主機。默認 'localhost'
.
localAddress
: 網絡連接綁定的本地接口。
localPort
: 網絡連接綁定的本地端口。
family
: IP 棧版本。默認 4
.對于本地域socket,參數 options
因為下列參數的對象:
path
: 客戶端連接到得路徑(必須).通用選項:
如果 allowHalfOpen
= true
, 當另一端 socket 發送 FIN 包時 socket 不會自動發送 FIN 包。socket 變為不可讀,但仍可寫。你需要顯式的調用 end()
方法。更多信息參見 'end' 事件。
connectListener
參數將會作為監聽器添加到'connect'事件上。
下面是一個用上述方法應答服務器的客戶端例子:
var net = require('net');
var client = net.connect({port: 8124},
function() { //'connect' listener
console.log('connected to server!');
client.write('world!\r\n');
});
client.on('data', function(data) {
console.log(data.toString());
client.end();
});
client.on('end', function() {
console.log('disconnected from server');
});
要連接到 socket /tmp/echo.sock
,僅需將第二行代碼改為:
var client = net.connect({path: '/tmp/echo.sock'});
創建一個到端口 port
和 主機 host
的 TCP 連接。如果忽略主機 host
,則假定為'localhost'
。參數 connectListener
將會作為監聽器添加到 'connect' 事件。
這是工廠方法,返回一個新的 'net.Socket'。
創建到 path
的 unix socket 連接。參數 connectListener
將會作為監聽器添加到 'connect' 事件上。
這是工廠方法,返回一個新的 'net.Socket'。
這個類用來創建一個 TCP 或本地服務器。
開始接受指定端口 port
和 主機 host
的連接。如果忽略主機 host
, 服務器將會接受任何 IPv4 地址(INADDR_ANY
)的直接連接。端口為 0,則會分配一個隨機端口。
積壓量(Backlog)為連接等待隊列的最大長度。實際長度由您的操作系統通過 sysctl 設定,比如 linux 上的tcp_max_syn_backlog
和 somaxconn
。這個參數默認值是 511 (不是 512)。
這是異步函數。當服務器被綁定時會觸發 'listening' 事件。最后一個參數 callback
將會作為'listening' 事件的監聽器。
有些用戶會遇到 EADDRINUSE
錯誤,它表示另外一個服務器已經運行在所請求的端口上。處理這個情況的辦法是等一段事件再重試:
server.on('error', function (e) {
if (e.code == 'EADDRINUSE') {
console.log('Address in use, retrying...');
setTimeout(function () {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});
(注意: Node 中的所有 socket 已設置了 SO_REUSEADDR
)
path
{String}callback
{Function}啟動一個本地 socket 服務器,監聽指定 path
的連接。
這是異步函數。綁定服務器后,會觸發 'listening' 事件。最后一個參數 callback
將會作為'listening' 事件的監聽器。
UNIX 上,本地域通常默認為 UNIX 域。參數 path
是文件系統路徑,就和創建文件時一樣,它也遵從命名規則和權限檢查,并且在文件系統里可見,并持續到關閉關聯。
Windows上,本地域通過命名管道實現。路徑必須是以 \\?\pipe\
或 \\.\pipe\
入口。任意字符串都可以,不過之后進行相同的管道命名處理,比如解決 ..
序列。管道命名空間是平的。管道不會一直持久,當最后一個引用關閉的時候,管道將會移除。不要忘記 javascript 字符字符串轉義要求路徑使用雙反斜杠,比如:
net.createServer().listen(
path.join('\\\\?\\pipe', process.cwd(), 'myctl'))
handle
{Object}callback
{Function}
handle
對象可以設置成 server 或 socket(任意以下劃線 _handle
開頭的成員),或者是 {fd: <n>}
對象。
這將是服務器用指定的句柄接收連接,前提是文件描述符或句柄已經綁定到端口或域 socket。
Windows 不支持監聽文件句柄。
這是異步函數。當服務器已經被綁定,將會觸發'listening' 事件。最后一個參數 callback
將會作為 'listening' 事件的監聽器。
options
{Object} - 必須. 支持以下屬性:port
{Number} - 可選.host
{String} - 可選.backlog
{Number} - 可選.path
{String} - 可選.exclusive
{Boolean} - 可選.callback
{Function} - 可選.options
的屬性:端口 port
, 主機 host
, 和 backlog
, 以及可選參數 callback 函數, 他們在一起調用server.listen(port, [host], [backlog], [callback])。還有,參數 path
可以用來指定 UNIX socket。
如果參數 exclusive
是false
(默認值),集群進程將會使用同一個句柄,允許連接共享。當參數exclusive
是 true
時,句柄不會共享,如果共享端口會返回錯誤。監聽獨家端口例子如下:
server.listen({
host: 'localhost',
port: 80,
exclusive: true
});
服務器停止接收新的連接,保持現有連接。這是異步函數,當所有連接結束的時候服務器會關閉,并會觸發 'close'
事件。你可以傳一個回調函數來監聽 'close'
事件。如果存在,將會調用回調函數,錯誤(如果有)作為唯一參數。
操作系統返回綁定的地址,協議族名和服務器端口。查找哪個端口已經被系統綁定時,非常有用。返回的對象有3個屬性,比如:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
例如:
var server = net.createServer(function (socket) {
socket.end("goodbye\n");
});
// grab a random port.
server.listen(function() {
address = server.address();
console.log("opened server on %j", address);
});
在 'listening'
事件觸發前,不要調用 server.address()
。
如果這是事件系統中唯一一個活動的服務器,調用 unref
將允許程序退出。如果服務器已被 unref,則再次調用 unref 并不會產生影響。
與 unref
相反,如果這是唯一的服務器,在之前被 unref
了的服務器上調用 ref
將不會讓程序退出(默認行為)。如果服務器已經被 ref
,則再次調用 ref
并不會產生影響。
設置這個選項后,當服務器連接數超過數量時拒絕新連接。
一旦已經用 child_process.fork()
方法將 socket 發送給子進程, 就不推薦使用這個選項。
已經拋棄這個函數。請用 server.getConnections() 代替。服務器上當前連接的數量。
當調用 child_process.fork()
發送一個 socket 給子進程時,它將變為 null
。 要輪詢子進程來獲取當前活動連接的數量,請用 server.getConnections
代替.
異步獲取服務器當前活躍連接的數量。當 socket 發送給子進程后才有效;
回調函數有 2 個參數 err
和 count
。
net.Server
是事件分發器 EventEmitter, 有以下事件:
當服務器調用 server.listen
綁定后會觸發。
當新連接創建后會被觸發。socket
是 net.Socket
實例。
服務器關閉時會觸發。注意,如果存在連接,這個事件不會被觸發直到所有的連接關閉。
發生錯誤時觸發。'close' 事件將被下列事件直接調用。請查看 server.listen
例子。
這個對象是 TCP 或 UNIX Socket 的抽象。net.Socket
實例實現了一個雙工流接口。 他們可以在用戶創建客戶端(使用 connect())時使用, 或者由 Node 創建它們,并通過 connection
服務器事件傳遞給用戶。
構造一個新的 socket 對象。
options
對象有以下默認值:
{ fd: null
allowHalfOpen: false,
readable: false,
writable: false
}
參數 fd
允許你指定一個存在的文件描述符。將 readable
和(或) writable
設為 true
,允許在這個 socket 上讀和(或)寫(注意,僅在參數 fd
有效時)。關于 allowHalfOpen
,參見createServer()
和 'end'
事件。
使用傳入的 socket 打開一個連接。如果指定了端口 port
和 主機 host
,TCP socket 將打開 socket 。如果忽略參數 host
,則默認為 localhost
。如果指定了 path
,socket 將會被指定路徑的 unix socket 打開。
通常情況不需要使用這個函數,比如使用 net.createConnection
打開 socket。只有你實現了自己的 socket 時才會用到。
這是異步函數。當 'connect' 事件被觸發時, socket 已經建立。如果這是問題連接, 'connect'
事件不會被觸發, 將會拋出 'error'
事件。
參數 connectListener
將會作為監聽器添加到 'connect' 事件。
是 net.Socket
的一個屬性,用于 socket.write()
。幫助用戶獲取更快的運行速度。計算機不能一直處于寫入大量數據狀態--網絡連接可能太慢。Node 在內部會將排隊數據寫入到socket,并在網絡可用時發送。(內部實現:輪詢 socket 的文件描述符直到變為可寫)。
這種內部緩沖的缺點是會增加內存使用量。這個屬性表示當前準備寫的緩沖字符數。(字符的數量等于準備寫入的字節的數量,但是緩沖區可能包含字符串,這些字符串是惰性編碼的,所以準確的字節數還無法知道)。
遇到很大增長很快的 bufferSize
時,用戶可用嘗試用pause()
和 resume()
來控制字符流。
設置 socket 的編碼為可讀流。更多信息參見stream.setEncoding()
在 socket 上發送數據。第二個參數指定了字符串的編碼,默認是 UTF8 編碼。
如果所有數據成功刷新到內核緩沖區,返回 true
。如果數據全部或部分在用戶內存里,返回 false
。當緩沖區為空的時候會觸發 'drain'
。
當數據最終被完整寫入的的時候,可選的 callback
參數會被執行,但不一定會馬上執行。
半關閉 socket。例如,它發送一個 FIN 包。可能服務器仍在發送數據。
如果參數 data
不為空,等同于調用 socket.write(data, encoding)
后再調用 socket.end()
。
確保沒有 I/O 活動在這個套接字上。只有在錯誤發生情況下才需要。(處理錯誤等等)。
暫停讀取數據。就是說,不會再觸發 data
事件。對于控制上傳非常有用。
調用 pause()
后想恢復讀取數據。
socket 閑置時間超過 timeout
毫秒后 ,將 socket 設置為超時。
觸發空閑超時事件時,socket 將會收到 'timeout'
事件,但是連接不會被斷開。用戶必須手動調用 end()
或 destroy()
這個socket。
如果 timeout
= 0, 那么現有的閑置超時會被禁用
可選的 callback 參數將會被添加成為 'timeout' 事件的一次性監聽器。
禁用納格(Nagle)算法。默認情況下 TCP 連接使用納格算法,在發送前他們會緩沖數據。將 noDelay
設置為 true
將會在調用 socket.write()
時立即發送數據。noDelay
默認值為 true
。
禁用/啟用長連接功能,并在發送第一個在閑置 socket 上的長連接 probe 之前,可選地設定初始延時。默認為 false。
設定 initialDelay
(毫秒),來設定收到的最后一個數據包和第一個長連接probe之間的延時。將 initialDelay 設為0,將會保留默認(或者之前)的值。默認值為0.
操作系統返回綁定的地址,協議族名和服務器端口。返回的對象有 3 個屬性,比如{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
。
如果這是事件系統中唯一一個活動的服務器,調用 unref
將允許程序退出。如果服務器已被 unref,則再次調用 unref 并不會產生影響。
與 unref
相反,如果這是唯一的服務器,在之前被 unref
了的服務器上調用 ref
將不會讓程序退出(默認行為)。如果服務器已經被 ref
,則再次調用 ref
并不會產生影響。
遠程的 IP 地址字符串,例如:'74.125.127.100'
or '2001:4860:a005::68'
.
遠程IP協議族字符串,比如 'IPv4'
or 'IPv6'
.
遠程端口,數字表示,例如:80
or 21
.
網絡連接綁定的本地接口遠程客戶端正在連接的本地 IP 地址,字符串表示。例如,如果你在監聽'0.0.0.0'而客戶端連接在'192.168.1.1',這個值就會是 '192.168.1.1'。
本地端口地址,數字表示。例如:80
or 21
.
接收到得字節數。
發送的字節數。
net.Socket
是事件分發器 EventEmitter的實例, 有以下事件:
在解析域名后,但在連接前,觸發這個事件。對 UNIX sokcet 不適用。
err
{Error | Null} 錯誤對象。 參見 dns.lookup().address
{String} IP 地址。family
{String | Null} 地址類型。 參見 dns.lookup().當成功建立 socket 連接時觸發。參見 connect()
.
當接收到數據時觸發。參數 data
可以是 Buffer
或 String
。使用 socket.setEncoding()
設定數據編碼。(更多信息參見 Readable Stream )。
當 Socket
觸發一個 'data'
事件時,如果沒有監聽器,數據將會丟失。
當 socket 另一端發送 FIN 包時,觸發該事件。
默認情況下(allowHalfOpen == false
),一旦 socket 將隊列里的數據寫完畢,socket 將會銷毀它的文件描述符。如果 allowHalfOpen == true
,socket 不會從它這邊自動調用 end(),使的用戶可以隨意寫入數據,而讓用戶端自己調用 end()。
當 socket 空閑超時時觸發,僅是表明 socket 已經空閑。用戶必須手動關閉連接。
參見 : socket.setTimeout()
當寫緩存為空得時候觸發。可用來控制上傳。
參見 : socket.write()
的返回值。
錯誤發生時觸發。以下事件將會直接觸發 'close'
事件。
had_error
{Boolean} 如果 socket 傳輸錯誤,為 true
當 socket 完全關閉時觸發。參數 had_error
是 boolean,它表示是否因為傳輸錯誤導致 socket 關閉。
測試是否輸入的為 IP 地址。字符串無效時返回 0。 IPV4 情況下返回 4, IPV6情況下返回 6.
如果輸入的地址為 IPV4, 返回 true,否則返回 false。
如果輸入的地址為 IPV6, 返回 true,否則返回 false。