您好,登錄后才能下訂單哦!
1.使用net模塊實現(xiàn)基于TCP的數(shù)據(jù)通訊
提供了一個net模塊,專用于實現(xiàn)TCP服務器與TCP客戶端之間的通信
1.1創(chuàng)建TCP服務器
在Node.js利用net模塊創(chuàng)建TCP服務器
var server = net.createServer([options],[connectionListener]) //options:false當TCP服務器接收到客戶端發(fā)送的一個FIN包時將會回發(fā)一個FIN包 true當TCP服務器接收到客戶端發(fā)送的一個FIN包時將不會回發(fā)FIN包,這使得TCP服務器可以繼續(xù)向客戶端發(fā)送數(shù)據(jù),但不會繼續(xù)接收客戶端發(fā)送的數(shù)據(jù)。來發(fā)者必須調(diào)用end方法來關(guān)閉socket連接。默認為false connectionListener:指定當客戶端與服務器端簡歷連接時所要調(diào)用的回調(diào)函數(shù) function(socket){ //回調(diào)函數(shù)代碼 }
參數(shù)值為TCP服務器監(jiān)聽的socket端口對象createServer方法返回被創(chuàng)建的TCP服務器
當客戶端與服務器建立連接時,觸發(fā)connection事件,可以利用下面方式執(zhí)行回調(diào)函數(shù)
server.on('connection',function(socket){ //回調(diào)函數(shù)代碼 })
在創(chuàng)建TCP服務器后,使用listen方法通知服務器開始監(jiān)聽客戶端連接
server.listen(port,[host],[backlog],[callback]) //port指定需要監(jiān)聽的端口號, host:指定需要監(jiān)聽的IP地址或主機名,如果省略,服務器將監(jiān)聽來自于任何IPv4地址的客戶端連接 backlog:指定位于等待隊列中的客戶端連接的最大數(shù)量 callback:無參回調(diào)函數(shù) server.listen(path,[callback]) //server:代表一個使用unix端口的服務器 path:指定需要監(jiān)聽的路徑,會觸發(fā)listening事件,然后執(zhí)行回調(diào)函數(shù)callback server.listenting(handle,[callback]) //server 代表一個TCP服務器 handle:指定需要監(jiān)聽的socket句柄(該句柄可以為一個TCP服務器對象,socket端口對象,文件描述符)
現(xiàn)舉例創(chuàng)建一個TCP服務器:
var net = require('net') var server = net.createServer(function(socket){ console.log('客戶端與服務器連接已建立') }) server.listen(8431,'localhost',function(){ console.log('服務器端開始監(jiān)聽') })
運行后可得如下結(jié)果:
利用telnet訪問對應的服務器:
telnet localhost 8431
會出現(xiàn)的結(jié)果如下:
socket端口對象舉例:
var net = require('net') var file = require('fs').createWriteStream('./message.txt'); var server = net.createServer(function(socket){ console.log('客戶端與服務器連接已建立') server.getConnections(function(err,count){ console.log('當前存在%d個客戶端連接。',count); server.maxConnections = 4; console.log('TCP服務器的最大連接數(shù)為%d',server.maxConnections); }) // server.close(function(){ // console.log('TCP服務器被關(guān)閉。'); // }) }) server.listen(8431,'localhost',function(){ console.log('服務器端開始監(jiān)聽') }) server.on('connection',function(socket){ address = socket.address(); console.log('被監(jiān)視的地址信息為%j',address); socket.pipe(file); socket.setEncoding('utf8'); socket.on('data',function(data){ console.log(data.toString()); console.log('已接受到%d字節(jié)數(shù)據(jù)。',socket.bytesRead); }); socket.on('end',function(){ file.end('再見') console.log('客戶端連接被關(guān)閉。') }) socket.pause(); setTimeout(function(){ console.log('*************') socket.resume(); socket.pipe(file,{end:false}); },30*1000); // socket.pipe(file,{end:false}); // setTimeout(function(){ // file.end('再見。'); // socket.unpipe(file); // },5000); socket.setTimeout(10*1000); socket.on('timeout',function(){ console.log('客戶端連接超時'); socket.setTimeout(0); }) })
1.2 創(chuàng)建TCP客戶端
建立TCP客戶端舉例:
var net = require("net"); var client = new net.Socket(); client.setEncoding('utf8'); client.connect(8431,'localhost',function(){ console.log('已連接到服務器'); client.write('你好'); console.log('當前已發(fā)送%d字節(jié)',client.bytesWritten); client.end('再見') console.log('當前已發(fā)送%d字節(jié)',client.bytesWritten); // setTimeout(function(){ // client.end('再見'); // },10*1000) }); client.on('data',function(data){ //console.log('已接收服務器端發(fā)送的數(shù)據(jù): '+data); console.log('已接收服務器端發(fā)送的數(shù)據(jù)'); }) client.on('error',function(err){ console.log('與服務器連接或通信的過程中發(fā)生了一個錯誤,錯誤編碼為%s',err.code); client.destroy(); })
同時需要建立對應的服務器:
var net = require('net'); var fs = require('fs'); var server = net.createServer(); server.on('connection',function(socket){ console.log('客戶端與服務器端連接已建立'); socket.setEncoding('utf8'); var readStream = fs.createReadStream('./server.js'); readStream.on('data',function(data){ var flag = socket.write(data); console.log('write方法的返回值為:'+flag); console.log('緩存隊列中當前緩存了%d字符。',socket.bufferSize); }) socket.on('data',function(data){ console.log('已連接客戶端發(fā)送的數(shù)據(jù):'+data); socket.write('確認數(shù)據(jù):'+data); }) socket.on('error',function(err){ console.log('客戶端通信的過程中發(fā)生了一個錯誤,錯誤編碼為%s',err.code); socket.destroy(); }) socket.on('end',function(){ console.log('客戶端連接被關(guān)閉。'); server.unref(); }) socket.on('close',function(had_error){ if(had_error){ console.log('由于一個錯誤導致socket端口被關(guān)閉。'); server.unref(); }else{ console.log('socket端口被正常關(guān)閉。'); } }) server.getConnections(function(err,count){ if(count==2) server.close(); }); }); server.listen(8431,'localhost'); server.on('close',function(){ console.log('TCP服務器被關(guān)閉。'); })
在Node.js中利用下面方法可以向客戶端或服務器不斷發(fā)送探測包,以確定連接狀態(tài);
socket.setKeepAlive([enable],[initialDelay]) //enable:true:啟用Keep-alive機制,不斷向?qū)Ψ桨l(fā)送一個探測包,如果沒有回應表示連接關(guān)閉 initialDelay:間隔時間(毫秒)
以上這篇Node.js學習之TCP/IP數(shù)據(jù)通訊(實例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。