使用 node.js 建構 TCP Server

使用 node.js 建構 TCP Server

目的:

  • 使用 node.js 建構簡單的 TCP server
  • 藉由建制的過程初步運作與了解 TCP 所謂的 “三次握手”

TCP 傳輸協定:

概述:

傳輸控制協定(英語:Transmission Control Protocol,縮寫為 TCP),是一種連接導向的、可靠的、基於位元組流的傳輸層通訊協定

運作方式 :

TCP用三路握手(three-way handshake)過程建立一個連線。

如圖示,分為三個階段:

  • 第一階段:client端 向 server端 請求連線
  • 第二階段:server端 向 client端 回應,告知 server 端 可以開始 傳輸資料
  • 第三階段:client端 開始向 server端傳輸資料

這邊對於 TCP 的說明只是個概述,如想深入了解請閱讀 傳輸控制協定

使用 node.js 建構 TCP Server

Node.js 的 Net 模組 可以提供 一些網路傳輸的工具,包含製作 server端 與 client端口的應用

有關 node js net 的說明與方法資訊,請閱讀 nodejs 官網

以下分 server端 與 client端 分開說明 :

Server 端 (建立 Server 端口):

step 1 : 引入 net module

1.在專案底下新增一個檔案為 server.js

2.引入 net 模組 :

var net = require('net')

step 2 : 使用 net 模組建制 TCP server

使用 net.createServer() 的方法,建制新的 TCP Server :

//建立 net.createServer() 的物件
var server = net.createServer()

//用 net method listen() 方法讓 本機的 8124 port  給此 TCP server 使用
server.listen(8124, function () {
  console.log('TCP Server start')
})

listen() 方法也可以針對 Domain name , 詳情請閱讀 nodejs 官網

setp 3 : 事件綁定

在 step 2 已經透過了 net 的 module 裡的 method 其實你的 TCP server 就已經完成了,非常容易,不過為了體驗 TCP 三路握手(three-way handshake), 在這個 step 裡我們將透過 net 提供的 method 來體驗

1.當 client端,向 server端 請求連線,並通知 client 可以開始傳輸資料的階段: (為 TCP 三路握手(three-way handshake)第二階段)

//使用 connection 事件
server.on('connection', function () {
  console.log('server端:收到 client 端連線請求,並通知 client 端可以開始傳送資料')
})

2.建立一個簡單的事件與 client端 互動 :

var server = net.createServer(function (socket) {

  // data event: 到收到資料傳輸時觸發事件 , argument 為對象傳輸的物件
  socket.on('data', function (data) {

    // write event: 傳輸資料的事件
    socket.write('hi', function () {
      console.log('server:收到 client端 傳輸資料為' + data + '回應 hi')
    })

  })
})

Client 端 (建立 Client 端口):

step 1 : 引入 net module

1.在專案底下新增一個檔案為 client.js

2.引入 net 模組 :

var net = require('net')

step 2 : 使用 net 模組建制 Client 端口

1.當 client端,向 server端 請求連線時的事件: (為 TCP 三路握手(three-way handshake)第一階段)

var client = net.connect({port: 8124}, function () {
  console.log('client端:向 server端 請求連線')
})

2.當 TCP Server 回應連線成功,通知可以開始傳輸資料的事件 為 TCP 三路握手(three-way handshake)第三階段)

// connect event : 與 server端 連線成功時的事件
client.on('connect', function (data) {
  console.log('client端:與 server端 連線成功,可以開始傳輸資料')
})

setp 3 : 事件綁定

建立一個簡單的事件與 client端 互動

// write event: 傳輸資料的事件
client.write('hello!', function () {
  console.log('client端:開始傳輸資料,傳輸的資料為 hello!')
})

// data event: 到收到資料傳輸時觸發事件 , argument 為對象傳輸的物件
client.on('data', function (data) {
  console.log('client端:收到 server端 傳輸資料為 ' + data.toString())

  //結束 client 端 連線
  client.end()
})

開始執行:

step 1 : 執行 TCP Server

node server.js

執行結果:

TCP Server start

step 2 : 執行 Client

node client.js

執行結果(Client):

client端:向 server端 請求連線
client端:與 server端 連線成功,可以開始傳輸資料
client端:開始傳輸資料
client端:收到 server端 傳輸資料為 hi

執行結果(TCP Server):

server端:收到 client 端請求,可以開始傳送資料
server:收到 client端 傳輸資料為hello!回應 hi

結論:

上述成果藉由自己動手,來對 TCP 傳輸控制協定有更進一步的理解,當然 TCP 事情遠不只這些,此教學只單單對 TCP 三路握手(three-way handshake)的事件進行說明,其餘還有很多如: Timeout,IP,Adress,等等諸多的協定與事件可以設定,個人認為從 TCP 入手,對於學習伺服器,和 http 等協定,是個還不錯的選擇