Node.js学习之TCP/IP数据通讯

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('服务器端开始监听')
})

运行后可得如下结果:

利用telnet访问对应的服务器:

telnet localhost 8431

会出现的结果如下:

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数据通讯的更多相关文章

  1. node.js学习笔记之json数据转string

    Node.js中的JSON问题   var str = '{"dir":"kunhony","param":"archive&qu ...

  2. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  3. Node.JS学习——学习笔记

    Node.JS--学习笔记 2020年02月23日11:52:01 我打算自学NodeJS-通过阅读NodeJS官网来完成. https://nodejs.org/dist/latest-v13.x/ ...

  4. Node.js学习看这里:基础、进阶、文章

    Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应用. Node.js采用事件 ...

  5. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  6. tcp/ip网络通讯安全加密方法

    tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等.但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的 ...

  7. NODE.JS学习的常见误区及四大名著

    NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...

  8. Node.js学习系列总索引

    Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...

  9. 【入门必备】最佳的 Node.js 学习教程和资料书籍

    Web 开发人员对 Node.js 的关注日益增多,更多的公司和开发者开始尝试使用 Node.js 来实现一些对实时性要求高,I/O密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...

随机推荐

  1. jQuery的基础跟JS的正则

    大家好,我是唯芸星,这是我的一点点学过的知识,呈现给大家                   1:正则表达式 包括: 1:正则表达式包括两部分 ①:定义正则表达式的规则 ②:正则表达式的规模(i/g/ ...

  2. 有var和没有var的本质区别

    我们创建一个变量: var a = 100: 同时,大家也知道,就是不写var关键字也可以创建.在很多教程和说法中,将没有var 的这个名称称之为“全局变量”.如果我在全局直接写一个var abc = ...

  3. Mock Server 入门

    Mock Server介绍 什么是mock ? 我在去年的时候介绍一篇幅 python mock的基本使用,http://www.cnblogs.com/fnng/p/5648247.html 主要是 ...

  4. 第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)

    目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的  (3) 分析stext函数如何启动内核:  (3.1) ...

  5. C# XmlDocument操作XML

    XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...

  6. 团队作业8——Beta 阶段冲刺6th day

    一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 完善订单功能 (2)今天计划完成的工作(具体如下) 完善支付功能 (3) 工作中遇到的困难(在表格中) 成员 昨天已完成的 ...

  7. Java-错误处理机制学习(一)异常处理

    注意:本文介绍Java中的异常处理理论知识及相关语法结构,对于实际应用来说是万万不够的.关于如何高效地使用异常,请查看Java-高效地使用Exception-实践. 异常处理的思想是,当应用程序处于异 ...

  8. JSP学习(一)之中文乱码问题的解决

    一.响应中的乱码 我们所看到的页面,是由服务器把内容放入响应(response)中,然后发送给浏览器的.如果响应中的数据无法被正常解析,就会出现中文乱码.为什么英文不存在乱码问题?因为无论是ISO-8 ...

  9. java第九次学习总结

    1. 本周学习总结 2.. 书面作业 1.常用异常 题目5-1 1.1 提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 以前编写的代码经常出现异 ...

  10. Java课程设计 学生基本信息管理个人博客

    学生基本信息管理系统个人博客 团队课程设计链接 http://www.cnblogs.com/ll321/p/7067598.html 个人负责模块 负责部分界面设计,处理代码: 处理部分数据库数据. ...