Node.js之如何創(chuàng)建TCP服務(wù)器端
什么是TCP
TCP全名為傳輸控制協(xié)議,在OSI七層模型(物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層)中屬于傳輸層協(xié)議。

TCP是面向連接的,傳輸之前需要3次握手形成會(huì)話,之后服務(wù)器端和客戶端才能互相發(fā)送數(shù)據(jù)。
在創(chuàng)建會(huì)話過(guò)程中,服務(wù)器和客戶端分別提供一個(gè)套接字,兩個(gè)套接字共同形成一個(gè)連接。
創(chuàng)建TCP服務(wù)端
api地址:http://nodejs.cn/api/net.html
服務(wù)端的創(chuàng)建我們使用node提供的net包,客戶端我們使用telnet工具來(lái)模擬。
簡(jiǎn)單實(shí)現(xiàn)一個(gè)TCP服務(wù)端:
const net = require("net");
const netServer = net.createServer((socket) => {
socket.on("data", (data) => {
socket.write("hello," + data.toString());
});
socket.on("end", () => {
console.log("bye bye ~");
});
socket.write("歡迎來(lái)到比爾吉沃特,請(qǐng)輸入召喚師名稱:");
});
netServer.listen(9186, () => {
console.log("running");
});來(lái)做個(gè)簡(jiǎn)單的解釋:我們調(diào)用net包的createServer方法來(lái)創(chuàng)建一個(gè)tcp服務(wù)。里面需要傳遞一個(gè)回調(diào)函數(shù)作為參數(shù),函數(shù)有一個(gè)參數(shù)為連接所需套接字。
在回調(diào)函數(shù)里面,我們綁定了data事件,它在數(shù)據(jù)傳輸?shù)臅r(shí)候會(huì)觸發(fā)。(傳輸?shù)臄?shù)據(jù)${data}為一個(gè)Buffer)
我們客戶端模擬一下:
? test-node telnet localhost 9186 Trying ::1... Connected to localhost. Escape character is '^]'. 歡迎來(lái)到比爾吉沃特,請(qǐng)輸入召喚師名稱:zhangsan hello,zhangsan
還有另外一種方法可以實(shí)現(xiàn),本身net.CreateServer()創(chuàng)建的服務(wù)器是一個(gè)EventEmitter實(shí)例:
const netServer = net.createServer();
netServer.on("connection", (socket) => {
socket.on("data", (data) => {
socket.write("welcome, " + data.toString());
});
socket.write("歡迎來(lái)到node.js, 請(qǐng)輸入你的名字:");
});
netServer.listen(9186, () => {
console.log("running");
});TCP服務(wù)的事件
這里簡(jiǎn)單列一下,詳細(xì)觸發(fā)條件在文檔:http://nodejs.cn/api/net.html
服務(wù)器事件:
listening server.listen()時(shí)觸發(fā)connection每一個(gè)客戶端連接到套接字時(shí)觸發(fā)close服務(wù)器關(guān)閉時(shí)觸發(fā)error服務(wù)器異常時(shí)觸發(fā)
連接事件:
data一端調(diào)用write()事件傳數(shù)據(jù),另一端觸發(fā)。end連接中任意一端發(fā)送了FIN數(shù)據(jù)時(shí)觸發(fā)connect客戶端事件,套接字與服務(wù)器端連接成功觸發(fā)drain任意一端調(diào)用write()事件傳數(shù)據(jù),當(dāng)前端觸發(fā)。error異常發(fā)生時(shí)close套接字完全關(guān)閉時(shí)timeout一定時(shí)間之后連接不在活躍時(shí)觸發(fā)。
注意點(diǎn)
Nagle算法:
緩沖區(qū)數(shù)據(jù)達(dá)到一定數(shù)量才會(huì)將其發(fā)出,以此節(jié)約網(wǎng)絡(luò)資源。
node中默認(rèn)開啟Nagle算法,使用socket.setNoDelay(true)關(guān)閉,使數(shù)據(jù)立即發(fā)送。
關(guān)閉Nagle算法之后,一端可能收到多個(gè)小數(shù)據(jù)包的合并,所以多次write()可能另一端只觸發(fā)一次data()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs同步調(diào)用獲取mysql數(shù)據(jù)時(shí)遇到的大坑
今天小編就為大家分享一篇關(guān)于nodejs同步調(diào)用獲取mysql數(shù)據(jù)時(shí)遇到的大坑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Node.js中sequelize時(shí)區(qū)的配置方法
這篇文章主要給大家介紹了關(guān)于Node.js中sequelize時(shí)區(qū)的配置方法,文中先對(duì)時(shí)區(qū)的基礎(chǔ)概念進(jìn)行了簡(jiǎn)單介紹,然后通過(guò)示例代碼詳細(xì)介紹了sequelize時(shí)區(qū)的配置方法,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
nodejs實(shí)例解析(輸出hello world)
本文主要介紹nodejs實(shí)例解析:輸出hello world的完整過(guò)程。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
nodejs使用http模塊發(fā)送get與post請(qǐng)求的方法示例
這篇文章主要介紹了nodejs使用http模塊發(fā)送get與post請(qǐng)求的方法,結(jié)合實(shí)例形式分析了nodejs基于http模塊實(shí)現(xiàn)發(fā)送get與post請(qǐng)求具體操作技巧,需要的朋友可以參考下2018-01-01
Nodejs中使用captchapng模塊生成圖片驗(yàn)證碼
本篇文章主要介紹了Nodejs中使用captchapng模塊實(shí)現(xiàn)圖片驗(yàn)證碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
Nodejs進(jìn)階之服務(wù)端字符編解碼和亂碼處理
這篇文章主要介紹了Nodejs進(jìn)階之服務(wù)端字符編解碼和亂碼處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

