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 获取URL参数的插件
Mar 04 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
Sep 18 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
Dec 03 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
Apr 06 Javascript
jquery显示隐藏元素的实现代码
May 19 Javascript
微信JS接口大全
Aug 25 Javascript
ES6实现的遍历目录函数示例
Apr 07 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
基于JavaScript中标识符的命名规则介绍
Jan 06 Javascript
p5.js绘制创意自画像
Nov 04 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
全文搜索和替换
2006/10/09 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
php简单复制文件的方法
2016/05/09 PHP
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
express express-session的使用小结
2018/12/12 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
python实现DEM数据的阴影生成的方法
2019/07/23 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
公司晚会主持词
2014/03/22 职场文书
人事专员岗位说明书
2014/07/29 职场文书
海洋天堂观后感
2015/06/05 职场文书
公司酒会致辞
2015/07/30 职场文书
初中数学教学反思范文
2016/02/17 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript