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 相关文章推荐
JS启动应用程序的一个简单例子
May 11 Javascript
javascript正则表达式定义(语法)总结
Jan 08 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
js获取Get值的方法
Sep 29 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
Bootstrap实现模态框效果
Sep 30 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
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加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
JS实现li标签的删除
2019/04/12 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python交换两个变量的值方法
2019/01/12 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
2014年师德师风学习材料
2014/05/16 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
课外访万家心得体会
2014/09/03 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
起诉书格式范文
2015/05/20 职场文书
一百条裙子读书笔记
2015/07/01 职场文书