Node入門教程(11)第九章:Node 的網絡模塊

net網絡模塊

net模塊是node對TCP或者IPC開發的封裝,包括了客戶端和服務器端相關API。對於閱讀本文,請您有必定的網絡編程的基礎。
您須要已經瞭解了:javascript

  • ip協議,會配置ip地址
  • 瞭解dns解析過程,瞭解dns的概念
  • 瞭解基本的TCP的協議的
  • 瞭解Socket的編程相關概念
  • 瞭解node的事件處理、流、文件處理等
  • 瞭解HTTP協議

本文,僅對部分API和TCP開發作一些簡單介紹。html

建立TCP服務器端

net.Server 類用於建立TCP的server,並且繼承了EventEmitter。經過net.createServer([options][, connectionListener])方法建立此類型實例。java

const net = require('net'); // 建立服務器端的 const server = net.createServer(); // 監聽異常錯誤事件 server.on('error', err => { // throw err; console.log(err); }); // 監聽客戶端的鏈接事件,客戶端鏈接上後,會自動執行回調函數,回調函數的參數就是指向客戶端的socket server.on('connection', clientSocket => { console.log('客戶端:%s', clientSocket.remoteAddress); // 監聽此客戶端的end事件。 clientSocket.on('end', () => { console.log('client disconnected'); }); // 監聽此客戶端發送數據的事件。 clientSocket.on('data', data => { console.log('收到數據:%s', data); }); // 向客戶端發送數據 clientSocket.write('Hi, aicoder.com '); // 2s後讓客戶端退出 setTimeout(() => { // 通知客戶端退出,併發送數據。 clientSocket.end('bye!'); }, 2000); }); // 服務器開始監聽60003端口(端口:0-65535之間的一個值) server.listen(60003, () => { console.log('opened server on', server.address()); }); // 如下爲關閉監聽的實例 // setTimeout(() => { // console.log('服務器端退出!!!'); // server.close(); // }, 5000); 

net.Server 是對服務器端的Socket的封裝,能夠監聽close事件、error事件、connection 事件、listening 事件。還能夠經過close()方法關閉服務的監聽。其餘用法參考官網文檔node

net.Socket 類是對客戶端Socket的封裝,能夠監聽 close 事件、 connect 事件 、data事件、drain 事件、end 事件、error 事件、lookup 事件、timeout 事件。可用的方法包括:write()發送數據、edn()結束鏈接等。其中能夠同data事件來處理服務器端的數據。git

建立TCP的客戶端

net.createConnection()方法能夠實現鏈接服務器端,並生成一個net.Socket 類實例,跟服務器端進行交互就是靠此實例。github

const net = require('net'); // 建立鏈接到服務器的客戶端 let client = net.createConnection('60003', '127.0.0.1', () => { client.write('Hi, client, for aicoder.com'); console.log('鏈接上服務器端!'); }); client.on('error', err => { console.log(err); }); client.on('end', () => { console.log('結束鏈接!'); }); client.on('close', () => { console.log('退出'); }); client.on('data', data => { console.log('收到數據: %s', data); }); 

經過Socket上傳文件的例子

const net = require('net'); const path = require('path'); const fs = require('fs'); // 建立服務器端的 const server = net.createServer(); // 監聽異常錯誤事件 server.on('error', err => { console.log(err); }); // 監聽客戶端的鏈接事件,客戶端鏈接上後,會自動執行回調函數,回調函數的參數就是指向客戶端的socket server.on('connection', clientSocket => { console.log('客戶端:%s', clientSocket.remoteAddress); // 監聽此客戶端的end事件。 clientSocket.on('end', () => { console.log('client disconnected'); }); // 監聽此客戶端發送數據的事件。 clientSocket.on('data', data => { console.log('收到數據:%s', data); let fileName = path.join(__dirname, 'b.html'); let ws = fs.createWriteStream(fileName); ws.write(data, 'utf8'); }); // 向客戶端發送數據 clientSocket.write('Hi, aicoder.com '); }); // 服務器開始監聽60003端口(端口:0-65535之間的一個值) server.listen(60003, () => { console.log('opened server on', server.address()); }); // 如下是客戶端代碼 const client = net.createConnection(60003, '127.0.0.1', () => { console.log('鏈接上服務器端!'); let fileName = path.join(__dirname, 'a.html'); let rs = fs.createReadStream(fileName, { encoding: 'utf8' }); // socket自己是可讀可寫流,因此能夠直接用管道。 rs.pipe(client); }); 

模擬一個WEB服務器軟件

若是您已經瞭解了HTTP協議的話,並且已經掌握如何作TCP的發送數據和接受處理數據,再有您稍微掌握一點字符串處理的技巧,那麼您就很容易作一個簡單的靜態web服務器出啦。固然這裏是說用底層的API,不是用http模塊。web

限於篇幅,在此再也不贅述,請直接看個人github源碼,僅僅是demo,不要用於生產環境中。編程

總結

node中對socket的封裝,仍是比較像node的開發風格的,可能跟其餘平臺的socket編程的風格不一致,可是原理和開發方式都是同樣的。這裏僅僅是簡單介紹一下Node下面網絡編程的基本方法,細節請參考官網文檔。api


老馬免費視頻教程服務器

返回教程列表首頁

github地址:https://github.com/malun666/aicoder_node

相關文章
相關標籤/搜索