Node.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實(shí)例講解)
1.使用net模塊實(shí)現(xiàn)基于TCP的數(shù)據(jù)通訊
提供了一個(gè)net模塊,專用于實(shí)現(xiàn)TCP服務(wù)器與TCP客戶端之間的通信
1.1創(chuàng)建TCP服務(wù)器
在Node.js利用net模塊創(chuàng)建TCP服務(wù)器
var server = net.createServer([options],[connectionListener])
//options:false當(dāng)TCP服務(wù)器接收到客戶端發(fā)送的一個(gè)FIN包時(shí)將會(huì)回發(fā)一個(gè)FIN包
true當(dāng)TCP服務(wù)器接收到客戶端發(fā)送的一個(gè)FIN包時(shí)將不會(huì)回發(fā)FIN包,這使得TCP服務(wù)器可以繼續(xù)向客戶端發(fā)送數(shù)據(jù),但不會(huì)繼續(xù)接收客戶端發(fā)送的數(shù)據(jù)。來發(fā)者必須調(diào)用end方法來關(guān)閉socket連接。默認(rèn)為false
connectionListener:指定當(dāng)客戶端與服務(wù)器端簡歷連接時(shí)所要調(diào)用的回調(diào)函數(shù)
function(socket){
//回調(diào)函數(shù)代碼
}
參數(shù)值為TCP服務(wù)器監(jiān)聽的socket端口對象createServer方法返回被創(chuàng)建的TCP服務(wù)器
當(dāng)客戶端與服務(wù)器建立連接時(shí),觸發(fā)connection事件,可以利用下面方式執(zhí)行回調(diào)函數(shù)
server.on('connection',function(socket){
//回調(diào)函數(shù)代碼
})
在創(chuàng)建TCP服務(wù)器后,使用listen方法通知服務(wù)器開始監(jiān)聽客戶端連接
server.listen(port,[host],[backlog],[callback]) //port指定需要監(jiān)聽的端口號, host:指定需要監(jiān)聽的IP地址或主機(jī)名,如果省略,服務(wù)器將監(jiān)聽來自于任何IPv4地址的客戶端連接 backlog:指定位于等待隊(duì)列中的客戶端連接的最大數(shù)量 callback:無參回調(diào)函數(shù) server.listen(path,[callback]) //server:代表一個(gè)使用unix端口的服務(wù)器 path:指定需要監(jiān)聽的路徑,會(huì)觸發(fā)listening事件,然后執(zhí)行回調(diào)函數(shù)callback server.listenting(handle,[callback]) //server 代表一個(gè)TCP服務(wù)器 handle:指定需要監(jiān)聽的socket句柄(該句柄可以為一個(gè)TCP服務(wù)器對象,socket端口對象,文件描述符)
現(xiàn)舉例創(chuàng)建一個(gè)TCP服務(wù)器:
var net = require('net')
var server = net.createServer(function(socket){
console.log('客戶端與服務(wù)器連接已建立')
})
server.listen(8431,'localhost',function(){
console.log('服務(wù)器端開始監(jiān)聽')
})
運(yùn)行后可得如下結(jié)果:

利用telnet訪問對應(yīng)的服務(wù)器:
telnet localhost 8431
會(huì)出現(xiàn)的結(jié)果如下:

socket端口對象舉例:
var net = require('net')
var file = require('fs').createWriteStream('./message.txt');
var server = net.createServer(function(socket){
console.log('客戶端與服務(wù)器連接已建立')
server.getConnections(function(err,count){
console.log('當(dāng)前存在%d個(gè)客戶端連接。',count);
server.maxConnections = 4;
console.log('TCP服務(wù)器的最大連接數(shù)為%d',server.maxConnections);
})
// server.close(function(){
// console.log('TCP服務(wù)器被關(guān)閉。');
// })
})
server.listen(8431,'localhost',function(){
console.log('服務(wù)器端開始監(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('客戶端連接超時(shí)');
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('已連接到服務(wù)器');
client.write('你好');
console.log('當(dāng)前已發(fā)送%d字節(jié)',client.bytesWritten);
client.end('再見')
console.log('當(dāng)前已發(fā)送%d字節(jié)',client.bytesWritten);
// setTimeout(function(){
// client.end('再見');
// },10*1000)
});
client.on('data',function(data){
//console.log('已接收服務(wù)器端發(fā)送的數(shù)據(jù): '+data);
console.log('已接收服務(wù)器端發(fā)送的數(shù)據(jù)');
})
client.on('error',function(err){
console.log('與服務(wù)器連接或通信的過程中發(fā)生了一個(gè)錯(cuò)誤,錯(cuò)誤編碼為%s',err.code);
client.destroy();
})
同時(shí)需要建立對應(yīng)的服務(wù)器:
var net = require('net');
var fs = require('fs');
var server = net.createServer();
server.on('connection',function(socket){
console.log('客戶端與服務(wù)器端連接已建立');
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('緩存隊(duì)列中當(dāng)前緩存了%d字符。',socket.bufferSize);
})
socket.on('data',function(data){
console.log('已連接客戶端發(fā)送的數(shù)據(jù):'+data);
socket.write('確認(rèn)數(shù)據(jù):'+data);
})
socket.on('error',function(err){
console.log('客戶端通信的過程中發(fā)生了一個(gè)錯(cuò)誤,錯(cuò)誤編碼為%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('由于一個(gè)錯(cuò)誤導(dǎo)致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服務(wù)器被關(guān)閉。');
})
在Node.js中利用下面方法可以向客戶端或服務(wù)器不斷發(fā)送探測包,以確定連接狀態(tài);
socket.setKeepAlive([enable],[initialDelay]) //enable:true:啟用Keep-alive機(jī)制,不斷向?qū)Ψ桨l(fā)送一個(gè)探測包,如果沒有回應(yīng)表示連接關(guān)閉 initialDelay:間隔時(shí)間(毫秒)
以上這篇Node.js學(xué)習(xí)之TCP/IP數(shù)據(jù)通訊(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格
這篇文章主要為大家詳細(xì)介紹了Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格的具體實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
使用iojs的jsdom庫實(shí)現(xiàn)同步系統(tǒng)時(shí)間
本文給大家分享的是使用iojs的jsdom庫實(shí)現(xiàn)與http://open.baidu.com/special/time/ 同步系統(tǒng)時(shí)間。思路非常的清晰,這里推薦給大家,有需要的小伙伴可以參考下。2015-04-04
Nodejs關(guān)于gzip/deflate壓縮詳解
本文主要向大家介紹了nodejs中關(guān)于gzip/deflate壓縮的2種方法,分別是管道壓縮和非管道壓縮,十分詳細(xì),并附帶示例,這里推薦給大家參考下。2015-03-03
node.js文件上傳重命名以及移動(dòng)位置的示例代碼
本篇文章主要介紹了node.js文件上傳重命名以及移動(dòng)位置的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Windows系統(tǒng)下Node.js的簡單入門教程
這篇文章主要介紹了Windows系統(tǒng)下Node.js的簡單入門教程,Node.js是用于后端編程的JavaScript框架,需要的朋友可以參考下2015-06-06

