Node.js学习之TCP/IP数据通讯(实例讲解)


Posted in Javascript onOctober 11, 2017

1.使用net模块实现基于TCP的数据通讯

提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信

1.1创建TCP服务器

在Node.js利用net模块创建TCP服务器

var server = net.createServer([options],[connectionListener])
//options:false当TCP服务器接收到客户端发送的一个FIN包时将会回发一个FIN包
   true当TCP服务器接收到客户端发送的一个FIN包时将不会回发FIN包,这使得TCP服务器可以继续向客户端发送数据,但不会继续接收客户端发送的数据。来发者必须调用end方法来关闭socket连接。默认为false
connectionListener:指定当客户端与服务器端简历连接时所要调用的回调函数
function(socket){
 //回调函数代码
}

参数值为TCP服务器监听的socket端口对象createServer方法返回被创建的TCP服务器

当客户端与服务器建立连接时,触发connection事件,可以利用下面方式执行回调函数

server.on('connection',function(socket){
//回调函数代码
})

在创建TCP服务器后,使用listen方法通知服务器开始监听客户端连接

server.listen(port,[host],[backlog],[callback])
//port指定需要监听的端口号,
host:指定需要监听的IP地址或主机名,如果省略,服务器将监听来自于任何IPv4地址的客户端连接
backlog:指定位于等待队列中的客户端连接的最大数量
callback:无参回调函数

server.listen(path,[callback])
//server:代表一个使用unix端口的服务器
path:指定需要监听的路径,会触发listening事件,然后执行回调函数callback

server.listenting(handle,[callback])
//server 代表一个TCP服务器
handle:指定需要监听的socket句柄(该句柄可以为一个TCP服务器对象,socket端口对象,文件描述符)

现举例创建一个TCP服务器:

var net = require('net')
var server = net.createServer(function(socket){
 console.log('客户端与服务器连接已建立')
})
server.listen(8431,'localhost',function(){
 console.log('服务器端开始监听')
})

运行后可得如下结果:

Node.js学习之TCP/IP数据通讯(实例讲解)

利用telnet访问对应的服务器:

telnet localhost 8431

会出现的结果如下:

Node.js学习之TCP/IP数据通讯(实例讲解)

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服务器的最大连接数为%d',server.maxConnections);
 
})

// server.close(function(){
 // console.log('TCP服务器被关闭。');
// })
})
server.listen(8431,'localhost',function(){
console.log('服务器端开始监听')

})
server.on('connection',function(socket){
address = socket.address();
console.log('被监视的地址信息为%j',address);
socket.pipe(file);
socket.setEncoding('utf8');
socket.on('data',function(data){
 console.log(data.toString());
 console.log('已接受到%d字节数据。',socket.bytesRead);
});
socket.on('end',function(){
 file.end('再见')
 console.log('客户端连接被关闭。')
})

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 创建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('当前已发送%d字节',client.bytesWritten);
client.end('再见')
console.log('当前已发送%d字节',client.bytesWritten);
// setTimeout(function(){
 // client.end('再见');  
// },10*1000)

});
client.on('data',function(data){
//console.log('已接收服务器端发送的数据: '+data);
console.log('已接收服务器端发送的数据');
})
client.on('error',function(err){
console.log('与服务器连接或通信的过程中发生了一个错误,错误编码为%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('已连接客户端发送的数据:'+data);
 socket.write('确认数据:'+data);
})
socket.on('error',function(err){
 console.log('客户端通信的过程中发生了一个错误,错误编码为%s',err.code);
 socket.destroy();
})
socket.on('end',function(){
 console.log('客户端连接被关闭。');
 server.unref();
})
socket.on('close',function(had_error){
 if(had_error){
  console.log('由于一个错误导致socket端口被关闭。');
  server.unref();
 }else{
  console.log('socket端口被正常关闭。');
 }
})
server.getConnections(function(err,count){
 if(count==2)
  server.close();
});
});

server.listen(8431,'localhost');
server.on('close',function(){
console.log('TCP服务器被关闭。');
})

在Node.js中利用下面方法可以向客户端或服务器不断发送探测包,以确定连接状态;

socket.setKeepAlive([enable],[initialDelay])
//enable:true:启用Keep-alive机制,不断向对方发送一个探测包,如果没有回应表示连接关闭
initialDelay:间隔时间(毫秒)

以上这篇Node.js学习之TCP/IP数据通讯(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript学习笔记之获取当前目录的实现代码
Dec 14 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
Nov 12 Javascript
jQuery创建DOM元素实例解析
Jan 19 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
javascript实现列表滚动的方法
Jul 30 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
Aug 02 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
Jul 10 jQuery
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
Aug 20 Javascript
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 #Javascript
AngularJS实现表单元素值绑定操作示例
Oct 11 #Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 #Javascript
js处理包含中文的字符串实例
Oct 11 #Javascript
解决JQuery全选/反选第二次失效的问题
Oct 11 #jQuery
React根据宽度自适应高度的示例代码
Oct 11 #Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 #Javascript
You might like
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
python判断变量是否为列表的方法
2020/09/17 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
小升初自荐信怎么写
2015/03/26 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
2016教师节问候语
2015/11/10 职场文书
小学班主任心得体会
2016/01/07 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
pytorch Dropout过拟合的操作
2021/05/27 Python