亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Nodejs學習筆記之NET模塊

2019-11-20 13:25:19
字體:
來源:轉載
供稿:網友

一,開篇分析

從今天開始,我們來深入具體的模塊學習,這篇文章是這個系列文章的第三篇,前兩篇主要是以理論為主,相信大家在前兩篇的學習中,

對NodeJS也有一個基本的認識,沒事?。。〕脽岽蜩F,讓我們繼續將NodeJS進行到底,好了廢話不多說,直接進入今天的主題 “Net模塊” ,那么”Net“應該如何理解那?

它是做什么用的那?(Net模塊可用于創建Socket服務器或Socket客戶端。NodeJS 的數據通信,最基礎的兩個模塊是 Net 和 Http,前者是基于 Tcp 的封裝,后者本質還是 Tcp 層,只不過做了比較多的數據封裝,我們視為表現層)。

這里參考一下NodeJS “http.js” 中的源碼:

從圖中不難看出 HttpServer繼承了Net類,具有了相關的通信能力,做了比較多的數據封裝,我們視為更高級的表現層。

擴展知識(以下是“inherits”的源碼):

復制代碼 代碼如下:

exports.inherits = function(ctor, superCtor) {
  ctor.super_ = superCtor;
  ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
      value: ctor,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
};

功能是實現繼承復用。

剛才做了一個簡要的概述,里面有一些常用的概念,這里做個簡短的概念普及介紹:

  (1),TCP/IP------TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸。

 ?。?),Socket------socket則是對TCP/IP協議的封裝和應用(程序層面)。

 ?。?),Http------HTTP是應用層協議,主要解決如何包裝數據。

  (4),網絡七層模型------物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

  總結一下:Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API)。

  從而形成了我們知道的一些最基本的函數接口,比如Create、Listen、Connect、Accept、Send、Read和Write等等。

  TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口

  實際上,傳輸層的TCP是基于網絡層的IP協議的,而應用層的HTTP協議又是基于傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。

二,體驗一把

好了,概念我們也有了,來個例子:

1,建立server.js

復制代碼 代碼如下:

var net = require('net') ;
var server = net.createServer(function(c) { // Connection監聽器
  console.log("服務器已連接") ;
  c.on("end", function() {
    console.log("服務器已斷開") ;
  }) ;
  c.write("Hello,Bigbear !/r/n") ;
  c.pipe(c) ;
}) ;
server.listen(8124, function() { // Listening監聽器
  console.log("服務器已綁定") ;
}) ;

2,建立client.js

復制代碼 代碼如下:

var net = require('net') ;
var client = net.connect({
    port: 8124
},function(){ // connect監聽器
  console.log("客戶端已連接") ;
  client.write('Hello,Baby !/r/n') ;
});
client.on("data", function(data) {
  console.log(data.toString()) ;
  client.end() ;
});
client.on("end", function(){
  console.log("客戶端斷開連接") ;
}) ;

分析一下:

服務端------net.createServer創建一個 TCP 服務,這個服務綁定(server.listen)在 8124 這個端口上,創建 Server 后我們看到有一個回調函數,

在調用上面函數的時候傳入一個參數,這個參數也是函數,并且接受了 socket ,這個由其他方法構造的一個管道(pipe),他的作用就是用來數據交互的。

pipe 是需要 Client 跟 Server 打招呼才能建立的,如果此刻沒有客戶端訪問 Server,這個 socket 就不會存在了。

客戶端------net.connect顧名思義,就是連接到服務端,第一個參數是對象,設置端口(port)為 8124,也就是我們服務器監聽的端口,由于沒有設置 host 參數,那默認就是 localhost (本地)。

在 Server 中,socket 是管道的一端,而在 client 中,client 本身就是管道的一端,如果是多個客戶端連接 Server,Server 會新建多個 socket,每個 socket 對應一個 client。

運行結果:

三,案例引入

(1),下面代碼僅僅是服務器向客戶端輸出一段文本,完成服務端到客戶端的單向通訊。

復制代碼 代碼如下:

//  Sever --> Client 的單向通訊
var net = require('net');
var chatServer = net.createServer();
chatServer.on('connection', function(client) {
  client.write('Hi!/n'); // 服務端向客戶端輸出信息,使用 write() 方法
  client.write('Bye!/n');
  client.end(); // 服務端結束該次會話
});
chatServer.listen(9000);

Telnet測試一下:telnet127.0.0.1:9000

執行 telnet后,與服務點連接,反饋 Hi! Bye! 的字符,并立刻結束服務端程序終止連接。

如果我們要服務端接到到客戶端的信息?

可以監聽 server.data 事件并且不要中止連接(否則會立刻結束無法接受來自客戶端的消息)。

(2),監聽 server.data 事件并且不要中止連接(否則會立刻結束無法接受來自客戶端的消息)。

復制代碼 代碼如下:

// 在前者的基礎上,實現 Client --> Sever 的通訊,如此一來便是雙向通訊
var net = require('net');
var chatServer = net.createServer(),   
    clientList = [];
chatServer.on('connection', function(client) {
  // JS 可以為對象自由添加屬性。這里我們添加一個 name 的自定義屬性,用于表示哪個客戶端(客戶端的地址+端口為依據)
  client.name = client.remoteAddress + ':' + client.remotePort; 
  client.write('Hi ' + client.name + '!/n'); 
  clientList.push(client); 
  client.on('data', function(data) {   
     broadcast(data, client);// 接受來自客戶端的信息 
  });
});
function broadcast(message, client) { 
    for(var i=0;i<clientList.length;i+=1) {   
      if(client !== clientList[i]) {     
        clientList[i].write(client.name + " says " + message);   
      } 
    }
}
chatServer.listen(9000);

上面是不是一個完整功能的代碼呢?我們說還有一個問題沒有考慮進去:那就是一旦某個客戶端退出,卻仍保留在 clientList里面,這明顯是一個空指針。

(3),處理clientList

復制代碼 代碼如下:

chatServer.on('connection', function(client) {
  client.name = client.remoteAddress + ':' + client.remotePort
  client.write('Hi ' + client.name + '!/n');
  clientList.push(client)
  client.on('data', function(data) {
    broadcast(data, client)
  })
  client.on('end', function() {
    clientList.splice(clientList.indexOf(client), 1); // 刪除數組中的制定元素。
  })
})

NodeTCPAPI已經為我們提供了 end 事件,即客戶端中止與服務端連接的時候發生。

(4),優化broadcast

復制代碼 代碼如下:

function broadcast(message, client) {
  var cleanup = []
  for(var i=0;i<clientList.length;i+=1) {
    if(client !== clientList[i]) {
      if(clientList[i].writable) { // 先檢查 sockets 是否可寫
        clientList[i].write(client.name + " says " + message)
      } else {
        cleanup.push(clientList[i]) // 如果不可寫,收集起來銷毀。銷毀之前要 Socket.destroy() 用 API 的方法銷毀。
        clientList[i].destroy()
      }
    }
  }  //Remove dead Nodes out of write loop to avoid trashing loop index
  for(i=0;i<cleanup.length;i+=1) {
    clientList.splice(clientList.indexOf(cleanup[i]), 1)
  }
}

注意的是一旦 “end” 沒有被觸發,會出現異常,所以才做優化工作。

(5),NetAPI中還提供一個 error 事件,用于捕捉客戶端的異常

復制代碼 代碼如下:

client.on('error', function(e) {
  console.log(e);
});

四,總結一下

1,理解開篇的相關概念

2,認識Http與Net模塊之間的關系

3,結合本文的例子,查閱相關api去實踐

4,socket客戶端與服務器端之間的通信思想

5,有興趣可以完善一下那個聊天室的例子

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品专区久久| 亚洲最大福利视频| 久久人人爽亚洲精品天堂| 欧美日韩国产一中文字不卡| 欧美一级片在线播放| 国产欧美婷婷中文| 91精品国产综合久久香蕉最新版| 97婷婷涩涩精品一区| 成人国产精品一区| 欧美午夜宅男影院在线观看| 一区二区三区天堂av| 精品久久久一区| 欧美影院在线播放| 91久久在线观看| 久久久999精品免费| 情事1991在线| 在线观看日韩欧美| 日本精品久久久| 欧美国产日韩一区二区三区| 久热精品视频在线观看| 国产精品mp4| 亚洲精品动漫100p| 成人欧美一区二区三区黑人孕妇| 欧美日韩一区二区免费在线观看| 久久五月天综合| 超碰97人人做人人爱少妇| 国产精品7m视频| 亚洲区一区二区| 日本高清视频一区| 亚洲iv一区二区三区| 日韩在线视频免费观看高清中文| 欧美激情高清视频| 亚洲xxxx视频| 亚洲电影成人av99爱色| 5252色成人免费视频| 精品二区三区线观看| 在线观看久久久久久| 欧美激情a∨在线视频播放| 久久91精品国产91久久久| 成人黄色生活片| 国产成人一区二| 亚洲大尺度美女在线| 国产一区二区三区直播精品电影| 亚洲美腿欧美激情另类| 国产精品久久久久9999| 国产日韩欧美夫妻视频在线观看| 中文国产成人精品久久一| 成人黄色在线免费| 日韩精品在线免费观看| 国产精品第三页| 国产精品扒开腿做| 久久伊人色综合| 日韩成人av网| 欧美一区二区视频97| 91在线视频九色| 国产精品久久久久77777| 亚洲性xxxx| 97超碰蝌蚪网人人做人人爽| 久久久久久久成人| 亚洲成人黄色在线观看| 中文字幕久久久av一区| 日韩国产激情在线| 91免费视频网站| 亚洲跨种族黑人xxx| 国产精品99一区| 久久久国产精品x99av| 国产成人精品久久久| 国产精品视频色| 91a在线视频| 成人激情在线观看| 亚洲午夜av久久乱码| 国产视频欧美视频| 亚洲精品少妇网址| 最近2019中文字幕第三页视频| 国产免费一区视频观看免费| 久久久精品国产| 欧美亚洲国产成人精品| 日韩欧美999| 亚洲欧美中文字幕在线一区| 亚洲аv电影天堂网| 性亚洲最疯狂xxxx高清| 97av视频在线| 在线视频日本亚洲性| 久久激情视频免费观看| 国产精品爽黄69天堂a| 久久久久久久91| 一本色道久久综合亚洲精品小说| 久久久久成人精品| 亚洲成人久久电影| 91网站在线看| 日韩日本欧美亚洲| 日韩资源在线观看| 欧美精品999| 亚洲最大成人免费视频| 在线日韩av观看| 97超碰蝌蚪网人人做人人爽| 国精产品一区一区三区有限在线| 亚洲国产精品高清久久久| 日韩欧中文字幕| 精品二区三区线观看| 国产v综合ⅴ日韩v欧美大片| 韩国美女主播一区| 精品视频在线播放色网色视频| 91天堂在线观看| 中文字幕av一区二区三区谷原希美| 久久久亚洲成人| 久久全国免费视频| 日韩精品视频在线| 亚洲成人激情小说| 亚洲黄色www网站| 亚洲自拍偷拍第一页| 97精品国产aⅴ7777| 欧美黄色三级网站| 国产精品美女网站| 亚洲美女精品久久| 欧美巨乳美女视频| 久久精品国产一区| 亚洲天堂成人在线| 欧美夫妻性生活视频| 国产精品三级在线| 激情亚洲一区二区三区四区| 日本sm极度另类视频| 亚洲第一色中文字幕| 国产精品久久激情| 91情侣偷在线精品国产| 日韩欧美在线观看视频| 国产精品中文字幕久久久| 日韩欧美中文在线| 久久深夜福利免费观看| 日本一区二区在线免费播放| 美女啪啪无遮挡免费久久网站| 亚洲一区免费网站| 日韩欧美高清在线视频| 琪琪亚洲精品午夜在线| 国产成人精品久久久| 欧洲成人午夜免费大片| 国产精品7m视频| 九九精品在线视频| 国产一区红桃视频| 亚洲国产精品99久久| 亚洲欧美第一页| 欧美性猛交xxx| 亚洲精品之草原avav久久| 国产精品夜间视频香蕉| 亚洲区免费影片| 欧美色xxxx| 欧洲美女7788成人免费视频| 国产91精品久久久久| 国产一区二区三区在线观看视频| 97色在线观看免费视频| 亚洲无线码在线一区观看| 成人免费看吃奶视频网站| 欧美精品电影免费在线观看| 97在线视频免费观看| 日韩视频免费看| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩国产影院| 亚洲乱码一区av黑人高潮| 91最新在线免费观看| 97久久精品在线| 国内免费久久久久久久久久久| 国产精品观看在线亚洲人成网| 成人www视频在线观看| 日韩av免费看|