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 相关文章推荐
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
Jul 23 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
JavaScript实现级联菜单的方法
Jun 29 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
Apr 01 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
JS打开摄像头并截图上传示例
Feb 18 Javascript
JavaScript实现简单图片轮播效果
Aug 21 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
Vue中遍历数组的新方法实例详解
Jul 21 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中的正则表达式函数介绍
2012/02/27 PHP
PHP引用(&)各种使用方法实例详解
2014/03/20 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
医院门卫岗位职责
2013/12/30 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
校本教研工作制度
2014/01/22 职场文书
教师现实表现材料
2014/02/14 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
如何Tomcat中使用ipv6地址
2022/05/06 Servers