標籤: nodejs udp tcp buffer
1byte代表的是乙個位元組,是在檔案儲存
的最小單位。在基本檔案單位中,我們有以下的等價關係。 1m = 1024 k,1k = 1024 byte。1bit代表則是乙個binary digit(二進位制數字)。說人話,就是1010101中的乙個1或者0。
tcp/udp協議
中,比較廣泛的定義是1 byte = 8 bit,這個定義不是嚴格的。換句話說,你可以選擇不遵守。
在計算機網路的七層協議中,這兩個是傳輸層的協議,我們常用的http協議屬於一種特殊的tcp連線。一般情況下,我們將tcp連線通過ip作為位址關聯,通過握手的方式連線,所以tcp協議又被稱為是tcp/ip協議。udp協議則是一種更為暴力的協議,一般沒有握手的過程,我們經常會把它用在dns的查詢上面。
tcp和udp的區別
區別udp
tcp連線性
面向非連線
面向連線
傳輸可靠性
不可靠可靠
應用場景
少量資料
傳輸大量資料速度快
慢 好了,我們先複習到這裡。如果還有不知道的,請qq你們的計算機網路老師。
對於tcp/http協議的場景,大家其實都是比較熟悉的,成熟的框架大家都是用的六六的,所以這裡就不再贅述,下文將著重於表達udp協議。
嗯,我們先來看一下乙個簡單的udp的例子。
// server.js
const dgram = require('dgram');
const server = dgram.createsocket('udp4');
server.on('error', (err) => `);
server.close();
});server.on('message', (msg, rinfo) => from $:$`);
});server.on('listening', () => :$`);
});server.bind(41234,()=>);
// server listening 0.0.0.0:41234
const dgram = require('dgram');
const message = buffer.from('some bytes');
const client = dgram.createsocket('udp4');
client.send(message, 41234, 'localhost', (err) => );
**還是很簡單的。使用到的庫是dgram
這個庫是node自帶的,直接require就ok,有關的事件如下:
常用的方法函式,如下:
具體的函式介紹和使用說明,請參閱官方文件。對於乙個簡單udp協議,使用的時候,我們一般將會把監聽和請求合併封裝在一起,作為乙個統一服務。
var dgram = require('dgram');
var server = dgram.createsocket('udp4')
var port = 0;
var targetport = 123;
var targetip = 10.10.10.10;//這裡也可以支援用網域名稱,它會自己做dns解析
function sendandrecv(targetport,targetip,desport,message,callback) from $:$`);
callback&&callback(message.tostring());
//這裡要注意哦,msg的型別是buffer哦!})}
})})
}
buffer物件的使用
js嘛,還是比較簡單的。我們直接看**吧。
//例項化
var buf = new buffer();
//寫buf.write("***xx");
//讀buf.readint8();
具體的型別說明和函式使用,請參考官方文件。
我們這裡著重說一下踩過的坑。在buffer物件中,使用的是byte記位。也就是說,對於如下:
var buf = new buffer(1);// 1 byte == 8bit 可以寫入 0x00 = 0000 0000
buf.writeint8(0x00);
//不同的長度,在寫入的時候,要使用不同的函式,具體需要使用到的函式請參考,上文給出的官方文件。
function getbuffer(value, length)
}
這裡順帶加乙個函式,如何把十進位制的ip string轉換成整型資料的js實現。
function ip2int(ip) |1\d\d|2[0-4]\d|25[0-5])\.(\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|1\d\d|2[0-4]\d|25[0-5])$/;
var xh = "", result = reg.exec(ip);
if (!result) return false;
return (parseint(result[1]) << 24
| parseint(result[2]) << 16
| parseint(result[3]) << 8
| parseint(result[4]));
}ip2int("10.10.10.10");//168430090
node操作目錄,路徑拼接
一 先引入核心模組 var fs require fs 一 建立目錄 建立了乙個名為demo的檔案 fs.mkdir demo err 二 刪除空目錄 空目錄是當前目錄下沒有任何檔案或資料夾 刪除了乙個名為demo的空資料夾 fs.rmdir demo err 三 讀取遍歷目錄 fs.readdir...
node處理get請求
看node已經有一段時間了,因為放假比較懶,沒有更新node。還是比較坑。年初沒專案哪只能來填填坑啦。如題,這篇寫node如何處理get請求。對於乙個前端碼農來說,後台給我們的第一印象就是介面,這也是為何前端工程師學node的原因。這篇就是說乙個get請求在node的環境下如何處理的。話不多說先貼 ...
node的其他包
為解決國內使用者連線npm registry緩慢的問題,搭建了自己的registry,即 npm映象源 過去,npm沒有提供修改registry的功能,因此,提供了乙個cli工具即cnpm,它支援除了npm publish以外的所有命令,只不過連線的是 映象源 如今,npm已經支援修改registr...