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 页面滚动到指定DIV实现代码
Sep 25 Javascript
js获取和设置属性的方法
Feb 20 Javascript
jquery 3D 标签云示例代码
Jun 12 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
JavaScript的React框架中的JSX语法学习入门教程
Mar 05 Javascript
零基础轻松学JavaScript闭包
Dec 30 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 Javascript
微信小程序+云开发实现欢迎登录注册
May 24 Javascript
vue实现搜索过滤效果
May 28 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 Javascript
Node.js 深度调试方法解析
Jul 28 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的面试题集,附我的答案和分析(一)
2006/11/19 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
Javascript的闭包
2009/12/31 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
跟老齐学Python之做一个小游戏
2014/09/28 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
网络安全方面的面试题
2015/11/04 面试题
应届生体育教师自荐信
2013/10/03 职场文书
十岁生日同学答谢词
2014/01/19 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
如何写早恋检讨书
2014/09/10 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
老人与海读书笔记
2015/06/26 职场文书
关于车尾的标语大全
2015/08/11 职场文书
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python