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 相关文章推荐
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
Dec 01 Javascript
工厂模式在JS中的实践
Jan 18 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
Apr 01 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
May 02 Javascript
node和vue实现商城用户地址模块
Dec 05 Javascript
微信小程序开发之转发分享功能
Oct 22 Javascript
html5调用摄像头截图功能
Jan 18 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版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
电钳专业个人求职信
2014/01/04 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
旅游节目策划方案
2014/05/26 职场文书
先进工作者推荐材料
2014/12/23 职场文书
教师个人年终总结
2015/02/11 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
win10清理dns缓存
2022/04/19 数码科技