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. PHP发送邮件功能--ThinkPHP3.2.3

    首先第一步   :在网上down了一个PHPMailer插件,插件地址>https://github.com/PHPMailer/PHPMailer下载解压后,这里我们只需要用到其中两个文件,如 ...

  2. Gvim安装nerd_tree插件

    1.先去官网下载nerd_tree插件 http://www.vim.org/scripts/script.php?script_id=1658 2.解压缩将nerd_tree目录下的doc目录和pl ...

  3. About the diffrence of wait timed_wait and block in java

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * @au ...

  4. new和newInstance区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp55     在初始化一个类,生成一个实例的时候:newInstance() ...

  5. HTTP请求范例

    package com.grefr.basemethod; /*JAVA发送HTTP请求,返回HTTP响应内容,实例及应用 博客分类: JAVA实现 Java.netBeanJDKApache . J ...

  6. java-多个数的和

    目的:实现多个整数相加. 思路:1.首先要确定用户所需整数的个数n,此部分由用户在键盘上输入. 2.创建一个长度为n的数组. 3.用户从键盘上输入n个整数并判断是否输入正确,正确则存入数组,否则重新输 ...

  7. JavaScript二维码生成——qrcode.js

    在开发中,有时候,我们需要根据不同的内容来动态生成二维码,则可以使用qrcode.js这个小插件来实现. 1.qrcode.js文件内容: (1)未压缩(qrcode.js): /** * @file ...

  8. 入门-什么是webshell?

    webshell是什么? 顾名思义,"web" - 显然需要服务器开放web服务,"shell" - 取得对服务器某种程度上操作权限. webshell常常被称 ...

  9. vi/vim键盘图-

    vi/vim键盘图-----又一张桌面背景好图 也许还是有很多人不能愿意用CLI的vi/Vim来写东西,不过,当你真的习惯了,它的高效性就是不可估量了.下面的这张图,一看就明白了,从此,学习变的不再艰 ...

  10. 当今游戏大作share的特性大盘点

    极品游戏制作时的考虑要素大盘点 不知不觉入坑Steam已近4年,虽然说Steam的毒性让很多人走向一条不归路,但是想我这样即使"中毒"还是很快乐很感恩的.那么本期文章就谈谈我对其中 ...