您好,登錄后才能下訂單哦!
前言
想必我們在用Node.js用的最多的應該是創建http服務,所以對于每個Web開發工程師而言,Node.js的網絡相關模塊學習是必不可少。
Node.js的網絡模塊架構
在Node.js的模塊里面,與網絡相關的模塊有Net、DNS、HTTP、TLS/SSL、HTTPS、UDP/Datagram,除此之外,還有v8底層相關的網絡模塊有tcp_wrap.cc
、udp_wrap.cc
、pipe_wrap.cc
、stream_wrap.cc
等等,在Javascript層以及C++層之間通過process.binding進行橋接相互通信。
Net模塊
Net模塊提供了一些用于底層的網絡通信接口,包括創建服務器以及客戶端,其中HTTP模塊也是基于Net模型的上層封裝,在Net模塊里面主要提供net.Server以及net.Socket
創建TCP服務端
創建一個TCP服務器,可以通過使用構造函數new net.Server
或者使用工廠方法net.createServer
,這兩個方法都會返回一個net.Server類,可接收兩個可選參數。
var net = require('net'); var server = net.createServer(function(socket){ socket .on('data',function(data){ console.log('socket data',data.toString()); socket.write( data.toString() ); }) .on('end',function(){ console.log('socket end') }) .on('error',function(error){ console.log('socket error',error); }); }); server.listen(56200,function(){ console.log('server run at ',server.address()); }); server.on('error',function(err){ throw err; }); // 執行后:server run at { address: '::', family: 'IPv6', port: 56200 }
在listen監聽的時候沒有指定端口的話會自動隨意監聽一個端口,創建完成一個TCP服務器后,使用tenlent 0.0.0.0 56200
,鏈接后可與服務器進行數據通信。通過createServer
實例化一個服務后,服務會去監聽客戶端請求,與客戶端建立了鏈接之后會在回調里面拋出建鏈的net.Socket
對象。
創建TCP客戶端
創建一個TCP客戶端鏈接可以使用構造函數new net.Socket
或者其工廠方法net.createConnection
,創建成功后都會返回一個net.Socket實例。
var net = require('net'); var client = net.createConnection({port:56200,host:'localhost'}); client.on('connect',function(){ console.log('client connect'); }); client.on('data',function(data){ console.log('client data',toString()); }); client.on('error',function(error){ throw error; }); client.on('close',function(){ console.log('client close'); });
Socket
socket是啥這里就不做詳細的闡述了,下面主要了解下net.Socket這個構造體主要有提供一些什么方法、監聽事件的使用。
相關事件
allowHalfOpen == false
)socket會自我銷毀(如果寫入待處理隊列里面還沒正式響應回包),但是我們可以設置allowHalfOpen
參數為true,這樣可以繼續往該socket里面寫數據,但是我們需要自己去調用 end 方法去消耗這個socket,不然可能會造成句柄泄漏。相關方法
相關屬性
undefined
。回包異常處理
服務器從客戶端接受到需要處理的數據后進入處理環節,再業務邏輯處理完成之前如果socket以外斷開的話,待服務器再給客戶端回報的時候會直接響應error
事件并報錯Error : This socket has benn ended by the other part
,所以在回報之前服務端需要先判斷該socket是否被銷毀,如果沒有被銷毀則回包,如果已經斷開則銷毀:
var net = require('net'); var biz = require('./biz'); var server = net.createServer(function(socket){ socket .on('data',function(data){ biz.do(data) .then(function(){ if( !socket.destroyed ) { socket.write( data.toString() ); } else { // do some report socket.destry(); } }) .catch(function(){ !socket.destroyed && socket.end('server handler error'); }); }) .on('end',function(){ console.log('socket end') }) .on('error',function(error){ console.log('socket error',error); }); }); server.listen(56200,function(){ console.log('server run at ',server.address()); }); server.on('error',function(err){ throw err; });
限制客戶端數據大小
對請求大小限制是服務安全里面比不可少的一個環節,服務端不能無限大小的去接受客戶端發送過來的所有數據,而限制大小就是第一道門檻。
var net = require('net'); var MAX_REQUEST_BYTES = 2 * 1024 * 1024; // 2M var server = net.createServer(function(socket){ socket .on('data',function(data){ if(data.bytesRead > MAX_REQUEST_BYTES) { socket.pause(); socket.end('data is too big, forbidden'); // do some report } }) .on('end',function(){ console.log('socket end') }) .on('error',function(error){ console.log('socket error',error); }); }); server.listen(56200,function(){ console.log('server run at ',server.address()); }); server.on('error',function(err){ throw err; });
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。