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 相关文章推荐
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
extjs_02_grid显示本地数据、显示跨域数据
Jun 23 Javascript
小米公司JavaScript面试题
Dec 29 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
跟我学习javascript的执行上下文
Nov 18 Javascript
jQuery入门之层次选择器实例简析
Dec 11 Javascript
灵活使用数组制作图片切换js实现
Jul 28 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
May 11 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
解决vue 表格table列求和的问题
Nov 06 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 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 和 MySQL 基础教程(一)
2006/10/09 PHP
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
详解js异步文件加载器
2016/01/24 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
Pyramid添加Middleware的方法实例
2013/11/27 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
实例Python处理XML文件的方法
2015/08/31 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
创业计划书撰写原则
2014/01/25 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
2014年终工作总结范本
2014/12/15 职场文书
大学学生会竞选稿
2015/11/19 职场文书
导游词之安徽九华山
2019/09/18 职场文书