當前位置:
首頁 > 最新 > Node通過UDP傳輸文件

Node通過UDP傳輸文件

對比TCP,UDP是更簡單的協議。對你來說意味著更多的工作:不僅僅是響應數據的發送和接收,你不得不準備迎接UDP易變的特性。UDP適合查詢和響應的協議,這就是為什麼會用在域名系統(DNS)上。它也是無狀態的。如果你想要傳輸數據並且對數據完整性要求不高,那麼UDP是個好選擇。這聽起來不太尋常,但是有些應用適合這些特性——流媒體協議和在線遊戲通常使用UDP。如果想要構建一個視頻流服務,你能夠通過TCP傳輸視頻,但是每個包都會有很大的開銷以確保傳輸。使用UDP,沒有簡單的方式發現數據丟失,但是視頻不需要關心偶爾的毛刺——你只需要數據盡量快。事實上,一些視頻和圖像格式能夠允許少量的數據丟失:JPEG格式能在一定程度上抗損。

實際上是通過一個流發送數據到一個UDP伺服器,而不是創建一個通用的文件傳輸機制。你能夠使用它學習Node基礎的數據報API。想要使用數據報從一個客戶往服務端傳輸數據。使用dgram模塊創建數據報sockets,然後使用socket.send發送數據。發送數據報跟TCP sockets很相似,但是API略有不同,而且數據報有自己的規則映射UDP包真實的結構。使用如下代碼創建一個服務端。

var dgram = require("dgram");

var socket = dgram.createSocket("udp4");

socket.bind(4000);

創建UDP socket。綁定到一個埠上。本例子創建了一個socket作為服務端,而且綁定到一個埠。埠可以是任意的,但是TCP和UDP中前1023埠是保留的。客戶端API與TCP sockets是不同的,因為UDP是無狀態協議。你必須一次性寫一個數據包,而且數據包(數據報)必須相對小——小於65507位元組。數據報最大大小依賴網路Maximum Transmission Unit(MTU)。64KB是上限,但通常不使用,因為大的數據包可以被網路丟棄。 使用dgram.createSocket創建一個客戶端socket與服務端相同。發送一個數據報需要一個buffer來承載,用偏移量來表明buffer中消息的開始、消息的長度、服務埠、遠程IP和一個可選的回調,當消息發出時會被觸發:

var message = "Sample message";

socket.send(new Buffer(message), 0, message.length, port, remoteIP);

例子中在一個程序里包括了一個客戶端和一個服務端。為了運行它,你必須發表兩個命令:node udp-client-server.js server來運行服務端,然後是node udp-client-server.js client remoteIP啟動客戶端。如果你在本地運行,remoteIP選項可以省略;我們設計了這個例子在一個單獨文件中,因此你能夠輕鬆地拷貝它到另一台電腦測試網路發送文件或者本機網路。

從當前的文件創建一個可讀流。創建一個新的數據流socket來作為客戶端使用。當可讀流準備好後,開始發送數據到伺服器上。使用stream.read(size)來讀取數據塊。當客戶端完成任務後,當不需要時調用unref來安全地關閉它。否則,發送數據到伺服器。創建一個socket來提供服務。當message事件被觸發時,列印數據到終端上。表示伺服器已經準備,可以提供給客戶端連接來列印消息。檢查命令行選項來確定是運行客戶端還是服務端。接受其他可選的配置來連接遠程的IP地址。當你運行這個例子,它開始檢查命令行選項來查看是否需要客戶端或者服務端。它也能夠接受一個選項參數,因此你能夠連接遠程伺服器。 如果客戶端被指定,那麼一個新的客戶端將會隨著一個新的數據報socket創建。這裡涉及通過fs模塊使用一個可讀流,所以我們有一些數據發送到服務端——我們使用了filename使它能讀取到當前文件,但是你能夠用它發送任意文件。在發送數據之前,我們需要確認文件是打開的,而且準備好被讀取,因此readable事件被訂閱了。這個事件的回調執行了sendData方法。它會在每個文件片段都重複調用——使用Stream.read一次會讀取一小片段文件,因此UDP包如果太大就允許默默丟棄。socket.send方法用來向服務端推送數據。讀取文件時返回的message對象是一個Buffer實例,能夠直接傳給socket.send。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 行家匯 的精彩文章:

Node創建TCP服務端和客戶端的方法
定義模版消息發送方法類庫的編寫及POST數據發送
Node如何讀取配置文件
Node中POSIX文件系統包裝器
Node可寫的流可用於輸出數據到底層

TAG:行家匯 |

您可能感興趣

Python實現TFTP文件傳輸
ASP.NET Web Forms XML 文件
Python用於NLP :處理文本和PDF文件
滲透技巧——Windows下NTFS文件的USN Journal
Tor項目發布用Tor網路傳輸文件的OnionShare 2
CodeWarrior IDE使用Tips-使用burner將elf文件轉換生成HEX和BIN文件的方法和步驟詳解
「兼容Hi-Res音樂文件和碟片」Pioneer UDP-LX500 UHD藍光機
微軟開始修復WIN10 Mobile用戶在Edge上無法打開PDF文件的錯誤
Spring Boot 文件上傳
文件內容搜索神奇-PowerGREP4
阿里巴巴旗下UCWeb在印度發布文件傳輸神器「UC Share」
基於 FUSE的Bittorrent 文件系統
Web Pages 文件
SpringMVC國際化與文件上傳
IPFS+Filecoin+More?迅雷發布區塊鏈文件系統TCFS
安卓Fast Share曝光:可快速傳文件 類似iOS AirDrop
試用 |「兼容Hi-Res音樂文件和碟片,純玩Hi-Fi也合適」Pioneer(先鋒)UDP-LX500 UHD藍光機
plink PED 文件格式介紹
Windows任意文件讀0 day POC公布
新型勒索軟體:利用GNU Privacy Guard加密文件