# 使用 Nodejs net module 撰寫 TCP server

## 簡介

本文將會講述以下重點

1. 如何使用 nodejs 撰寫 tcp 的伺服器
    
2. 透過 wireshark 等工具驗證傳輸的 Data 內容
    

## 1. 如何使用 nodejs 撰寫 tcp 的伺服器

為了能夠有效展示透過 Nodejs 撰寫 TCP server 的傳輸資料流程

以下將透過撰寫兩個程式來做邏輯驗證

* simple-tcp-app.ts: 接收資料用的 TCP server
    
* simple-sender.ts: 傳輸資料用的 TCP client
    

### 1.1 nodejs 的 [net module](https://nodejs.org/api/net.html)

net module 是 Nodejs 用來處理網路傳輸的最底層處理模組

可以用來處理底從封包資料的傳送

在其之上還有比較網路應用的處理模組比如 [http](https://nodejs.org/api/http.html), [https](https://nodejs.org/api/https.html) module 等等

這邊使用 net module 來做 tcp 這種比較底層資料格式資料的處理

### 1.2 撰寫 TCP Server 邏輯

這邊主要使用 tcp server 來接收 tcp client 所傳入的資料並且顯示在 server console 上

實作邏輯如下：

1. 透過 net module 建立一個 TCP server
    
2. 設定服務阜口為 3099 ，並且設定監聽資料事件與啟動事件
    

```typescript
import * as net from 'net';
const port = 3099;
const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log(data);
  });
});

server.listen(port, '127.0.0.1', () => {
  console.log('opened server on', server.address());
});
```

### 1.2 撰寫 TCP Client 邏輯

這邊 tcp client 主要就是傳輸資料給 tcp server

因為 TCP 傳輸主要是透過 binary 資料傳輸

因此會使用 Buffer 來做資料轉換

實作邏輯如下：

1. 透過 net module 建立一個 TCP client 連線到服務阜口為 3099的服務
    
2. 設定連線後執行傳輸動作
    

```typescript
import * as net from 'net';

const socket = net.createConnection({
  host: '127.0.0.1',
  port: 3099
}, () => {
  const buffer = Buffer.alloc(8);
  buffer[0] = 12;
  buffer[1] = 34;
  socket.write(buffer);
});
```

### 1.3 執行 client 與 server 來驗證傳輸

測試步驟：

1. 啟動 server
    
    ![](https://i.imgur.com/ikvDqim.png)
    
2. 啟動 client 執行接收
    
    ![](https://i.imgur.com/KBQ0DFt.png)
    
3. 檢查 server 接收 log
    
    ![](https://i.imgur.com/nq2Zvie.png)
    

## 2. 透過 wireshark 等工具驗證傳輸的 Data 內容

1. 開啟 wireshark 檢查資料 loopback interface 封包如下
![](https://i.imgur.com/OFIinPV.png)
    
2. 故意把傳輸 size 改小再度驗證
    

```typescript
import * as net from 'net';

const socket = net.createConnection({
  host: '127.0.0.1',
  port: 3099
}, () => {
  const buffer = Buffer.alloc(2);
  buffer[0] = 12;
  buffer[1] = 34;
  socket.write(buffer);
});
```

1. 故意把傳輸 size 改小再度驗證 oopback interface 封包如下
    
    ![](https://i.imgur.com/uLQK55h.png)
    

## 3. 參考文件
[1]:[net module](https://nodejs.org/api/net.html)
[2]:[http module](https://nodejs.org/api/http.html)
[3]:[https module](https://nodejs.org/api/https.html)
