nodeJS之TCP模組net

來源:互聯網
上載者:User

標籤:[]   settime   img   非同步網路   use   ==   描述   sockets   參數   

前面的話

  TCP服務在網路應用中十分常見,目前大多數的應用都是基於TCP搭建而成的。net模組提供了一個非同步網路封裝器,用於TCP網路編程,它包含了建立伺服器和用戶端的方法。本文將詳細介紹nodeJS中的net模組

 

IP測試

【net.isIP(input)】

  測試是否輸入的為 IP 位址。字串無效時返回 0。 IPV4 情況下返回 4, IPV6情況下返回 6

var net = require(‘net‘);console.log(net.isIP(‘1.1.1.1‘));//4console.log(net.isIP(‘1.1‘));//0console.log(net.isIP(‘AD80::ABAA:0000:00C2:0002‘));//6

【net.isIPv4(input)】

  如果輸入的地址為 IPV4, 返回 true,否則返回 false

var net = require(‘net‘);console.log(net.isIPv4(‘1.1.1.1‘));//trueconsole.log(net.isIPv4(‘1.1‘));//false

【net.isIPv6(input)】

  如果輸入的地址為 IPV6, 返回 true,否則返回 false

var net = require(‘net‘);console.log(net.isIPv6(‘1.1.1.1‘));//trueconsole.log(net.isIPv6(‘AD80::ABAA:0000:00C2:0002‘));//true

 

伺服器

【net.createServer([options][, connectionListener])】

  建立一個 TCP 伺服器,參數如下

options    allowHalfOpen: false(預設),如果為true,當另一端socket發送FIN包時socket不會自動發送FIN包。socket變為不可讀但可寫(半關閉)    pauseOnConnect: false(預設),如果為true,當串連到來的時候相關聯的socket將會暫停。它允許在初始進程不讀取資料情況下,讓串連在進程間傳遞。調用resume()從暫停socket裡讀取資料connectionListener 自動給 ‘connection‘ 事件建立監聽器
var server = net.createServer(function() {});

【server.listen(port[, host][, backlog][, callback])】

  開始接受指定連接埠port和主機host的串連。如果忽略主機host,伺服器將會接受任何IPv4地址(INADDR_ANY)的直接連接。連接埠為0,則會分配一個隨機連接埠

  積壓量(Backlog)為串連等待隊列的最大長度。實際長度由作業系統通過sysctl設定,比如linux上的tcp_max_syn_backlog和somaxconn。這個參數預設值是511

  當伺服器被綁定時會觸發‘listening‘事件。最後一個參數callback將會作為‘listening‘事件的監聽器

  有些使用者會遇到EADDRINUSE錯誤,它表示另外一個伺服器已經運行在所請求的連接埠上。處理這個情況的辦法是等一段時間後再重試

server.listen(6000);

【server.close([callback])】

  伺服器停止接收新的串連,保持現有串連。當所有串連結束的時候伺服器會關閉,並會觸發‘close‘事件。你可以傳一個回呼函數來監聽‘close‘事件。如果存在,將會調用回呼函數,錯誤(如果有)作為唯一參數

【server.address()】

  作業系統返回綁定的地址、協議族名和伺服器連接埠。尋找哪個連接埠已經被系統綁定時,非常有用

  [注意]在 ‘listening‘ 事件觸發前,不要調用 server.address()

server.listen(function() {    //{ address: ‘::‘, family: ‘IPv6‘, port: 53806 }    console.log(server.address());});

【server.maxConnections】

  設定這個選項後,當伺服器串連數超過數量時拒絕新串連

  一旦已經用 child_process.fork() 方法將 socket 發送給子進程, 就不推薦使用這個選項

【server.getConnections(callback)】

  非同步擷取伺服器當前活躍串連的數量。當 socket 發送給子進程後才有效;

  回呼函數有 2 個參數 err 和 count

server.getConnections(function(err,count){    console.log(count);//0})

【事件listening】

  當伺服器調用 server.listen 綁定後會觸發

【事件connection】

{Socket object} 連線物件

  當新串連建立後會被觸發。socket 是 net.Socket執行個體

【事件close】

  伺服器關閉時會觸發

  [注意]如果存在串連,這個事件不會被觸發直到所有的串連關閉

【事件error】

  發生錯誤時觸發

 

用戶端

【net.connect(options[, connectionListener])】

【net.createConnection(options[, connectionListener])】

  connect()的別名是createConnection()方法

  該方法返回一個新的 ‘net.Socket‘,並串連到指定的地址和連接埠。當 socket 建立的時候,將會觸發 ‘connect‘ 事件。和‘net.Socket‘有相同的方法

  對於 TCP sockets,參數options如下

port: 用戶端串連到 Port 的連接埠(必須)host: 用戶端要串連到得主機。預設 ‘localhost‘localAddress: 網路連接綁定的本地介面localPort: 網路連接綁定的本地連接埠family : IP 棧版本。預設 4

  對於本地區socket,參數options如下

path: 用戶端串連到得路徑(必須)
var client = net.connect({port: 5000}, function() {});

 

Socket

【new net.Socket([options])】

  構造一個新的 socket 對象

  options 對象有以下預設值:

{ fd: null  allowHalfOpen: false,  readable: false,  writable: false}

  參數fd允許指定一個存在的檔案描述符。將readable和(或)writable設為true,允許在這個socket上讀或寫(僅在參數fd有效時)

【socket.connect(port[, host][, connectListener])】

【socket.connect(path[, connectListener])】

  使用傳入的socket開啟一個串連。如果指定了連接埠port和主機host,TCP socket將開啟socket。如果忽略參數host,則預設為localhost。如果指定了path,socket將會被指定路徑的unix socket 開啟

  參數 connectListener 將會作為監聽器添加到 ‘connect‘ 事件

【socket.write(data[, encoding][, callback])】

  在socket上發送資料。第二個參數指定了字串的編碼,預設是UTF8編碼

  如果所有資料成功重新整理到核心緩衝區,返回true。如果資料全部或部分在使用者記憶體裡,返回false。當緩衝區為空白的時候會觸發‘drain‘

  當資料最終被完整寫入的的時候,可選的callback參數會被執行,但不一定會馬上執行

【socket.end([data][, encoding])】

  半關閉socket。例如,它發送一個FIN包。可能伺服器仍在發送資料。

  如果參數data不為空白,等同於調用socket.write(data,encoding)後再調用socket.end()

【socket.destroy()】

  確保沒有 I/O 活動在這個通訊端上。只有在錯誤發生情況下才需要

【socket.pause()】

  暫停讀取資料。就是說,不會再觸發 data 事件。對於控制上傳非常有用

【socket.resume()】

  調用 pause() 後想恢複讀取資料

【socket.setTimeout(timeout[, callback])】

  socket 閑置時間超過 timeout 毫秒後 ,將 socket 設定為逾時。觸發空閑逾時事件時,socket 將會收到 ‘timeout‘事件,但是串連不會被斷開。使用者必須手動調用 end() 或 destroy() 這個socket。

  如果 timeout = 0, 那麼現有的閑置逾時會被禁用。可選的 callback 參數將會被添加成為 ‘timeout‘ 事件的一次性監聽器

【socket.setNoDelay([noDelay])】

  禁用納格(Nagle)演算法。預設情況下 TCP 串連使用納格演算法,在發送前他們會緩衝資料。將 noDelay 設定為 true 將會在調用 socket.write() 時立即發送資料。noDelay 預設值為 true

【socket.setKeepAlive([enable][, initialDelay])】

  禁用/啟用長串連功能,在發送第一個在閑置socket上的長串連probe之前,可選地設定初始延時。預設false

  設定initialDelay(毫秒),來設定收到的最後一個資料包和第一個長串連probe之間的延時。將 initialDelay 設為0,將會保留預設(或者之前)的值。預設值為0

【socket.address()】

  作業系統返回綁定的地址,協議族名和伺服器連接埠。返回的對象有 3 個屬性,比如{ port: 12346, family: ‘IPv4‘, address: ‘127.0.0.1‘ }

【socket.remoteAddress】

  遠端 IP 位址字串

【socket.remoteFamily】

  遠程IP協議族字串

【socket.remotePort】

  遠程連接埠,數字表示

【socket.localAddress】

  遠程用戶端正在串連的本地IP地址,字串表示

【socket.localPort】

  本地連接埠地址,數字表示

【socket.bytesRead】

  接收的位元組數

【socket.bytesWritten】

  發送的位元組數

【事件lookup】

  在解析網域名稱後,但在串連前,觸發這個事件。對 UNIX sokcet 不適用

err {Error | Null} 錯誤對象address {String} IP 位址。family {String | Null} 地址類型

【事件connect】

  當成功建立 socket 串連時觸發、

【事件data】

{Buffer object}

  當接收到資料時觸發。參數 data 可以是 Buffer 或 String

  當 Socket 觸發一個 ‘data‘ 事件時,如果沒有監聽器,資料將會丟失

【事件end】

  當 socket 另一端發送 FIN 包時,觸發該事件

【事件timeout】

  當 socket 空閑逾時時觸發,僅是表明 socket 已經空閑。使用者必須手動關閉串連

【事件drain】

  當寫緩衝為空白得時候觸發。可用來控制上傳

【事件error】

  錯誤發生時觸發

【事件close】

had_error {Boolean} 如果 socket 傳輸錯誤,為 true

  當 socket 完全關閉時觸發。參數 had_error 是 boolean,它表示是否因為傳輸錯誤導致 socket 關閉

 

簡易伺服器

【伺服器】

//server.jsvar net = require(‘net‘) ;var server = net.createServer(function(socket) {     socket.write("Hi!\n");    socket.on("data", function(data) {      console.log(data.toString());    });    socket.on("end", function() {      console.log(‘有客戶機下線了!!!‘);    });    socket.on(‘error‘, function() {      console.log(‘發生意外錯誤!!!‘);    });}) ;server.listen(8080) ;

【客戶機】

//client.jsvar net = require(‘net‘) ;var client = net.connect({port: 8080},function(){    client.name = ‘客戶機1‘;    client.write(client.name + ‘ 上線了!\n‘);    client.end(client.name + ‘ 下線了!\n‘);    client.on("data", function(data) {        console.log(data.toString());    });});

 

簡易聊天室

【伺服器】

//chatServer.jsvar net = require(‘net‘);var i = 0;//儲存客戶機var clientList = [];var server = net.createServer(function(socket) {    socket.name = ‘使用者‘ + (++i);    socket.write(‘【聊天室提示】歡迎‘ + socket.name + ‘\n‘);    //更新客戶機數組    clientList.push(socket);     function showClients(){        console.log(‘【當前線上使用者】:‘);        for(var i=0;i<clientList.length;i++) {             console.log(clientList[i].name);        }            }    showClients();    socket.on("data", function(data) {        //把當前串連的客戶機的資訊轉寄到其他客戶機          for(var i=0;i<clientList.length;i++) {             if(socket !== clientList[i]) {                      clientList[i].write(‘【‘ + socket.name + ‘】:‘ + data);               }          }    });    socket.on("close", function() {        //當前客戶機下線時,將其從客戶機數組中移除        clientList.splice(clientList.indexOf(socket), 1);        showClients();    });    socket.on(‘error‘, function(err) {        console.log(socket.name + ‘退出‘);    });});server.listen(8080) ;

【客戶機】

//chatClient.jsvar net = require(‘net‘);process.stdin.resume();process.stdin.setEncoding(‘utf8‘);var client = net.connect({port: 8080},function(){    console.log(‘【本機提示】登入到聊天室‘);    process.stdin.on(‘data‘,function(data){        client.write(data);    })    client.on("data", function(data) {        console.log(data.toString());    });    client.on(‘end‘, function() {        console.log(‘【本機提示】退出聊天室‘);        process.exit();    });    client.on(‘error‘, function() {        console.log(‘【本機提示】聊天室異常‘);        process.exit();    });});

 

nodeJS之TCP模組net

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.