nodeJS之TCP模块net
前面的话
TCP服务在网络应用中十分常见,目前大多数的应用都是基于TCP搭建而成的。net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法。本文将详细介绍nodeJS中的net模块
IP测试
【net.isIP(input)】
测试是否输入的为 IP 地址。字符串无效时返回 0。 IPV4 情况下返回 4, IPV6情况下返回 6
var net = require('net');
console.log(net.isIP('1.1.1.1'));//
console.log(net.isIP('1.1'));//
console.log(net.isIP('AD80::ABAA:0000:00C2:0002'));//
【net.isIPv4(input)】
如果输入的地址为 IPV4, 返回 true,否则返回 false
var net = require('net');
console.log(net.isIPv4('1.1.1.1'));//true
console.log(net.isIPv4('1.1'));//false
【net.isIPv6(input)】
如果输入的地址为 IPV6, 返回 true,否则返回 false
var net = require('net');
console.log(net.isIPv6('1.1.1.1'));//true
console.log(net.isIPv6('AD80::ABAA:0000:00C2:0002'));//true
服务器
【net.createServer([options][, connectionListener])】
创建一个 TCP 服务器,参数如下
options
allowHalfOpen: false(默认),如果为true,当另一端socket发送FIN包时socket不会自动发送FIN包。socket变为不可读但可写(半关闭)
pauseOnConnect: false(默认),如果为true,当连接到来的时候相关联的socket将会暂停。它允许在初始进程不读取数据情况下,让连接在进程间传递。调用resume()从暂停的socket里读取数据
connectionListener 自动给 'connection' 事件创建监听器
var server = net.createServer(function() { });
【server.listen(port[, host][, backlog][, callback])】
开始接受指定端口port和主机host的连接。如果忽略主机host,服务器将会接受任何IPv4地址(INADDR_ANY)的直接连接。端口为0,则会分配一个随机端口
积压量(Backlog)为连接等待队列的最大长度。实际长度由操作系统通过sysctl设定,比如linux上的tcp_max_syn_backlog和somaxconn。这个参数默认值是511
当服务器被绑定时会触发'listening'事件。最后一个参数callback将会作为'listening'事件的监听器
有些用户会遇到EADDRINUSE错误,它表示另外一个服务器已经运行在所请求的端口上。处理这个情况的办法是等一段时间后再重试
server.listen(6000);
【server.close([callback])】
服务器停止接收新的连接,保持现有连接。当所有连接结束的时候服务器会关闭,并会触发'close'事件。你可以传一个回调函数来监听'close'事件。如果存在,将会调用回调函数,错误(如果有)作为唯一参数
【server.address()】
操作系统返回绑定的地址、协议族名和服务器端口。查找哪个端口已经被系统绑定时,非常有用
[注意]在 'listening' 事件触发前,不要调用 server.address()
server.listen(function() {
//{ address: '::', family: 'IPv6', port: 53806 }
console.log(server.address());
});
【server.maxConnections】
设置这个选项后,当服务器连接数超过数量时拒绝新连接
一旦已经用 child_process.fork() 方法将 socket 发送给子进程, 就不推荐使用这个选项
【server.getConnections(callback)】
异步获取服务器当前活跃连接的数量。当 socket 发送给子进程后才有效;
回调函数有 2 个参数 err 和 count
server.getConnections(function(err,count){
console.log(count);//
})
【事件listening】
当服务器调用 server.listen 绑定后会触发
【事件connection】
{Socket object} 连接对象
当新连接创建后会被触发。socket 是 net.Socket实例
【事件close】
服务器关闭时会触发
[注意]如果存在连接,这个事件不会被触发直到所有的连接关闭
【事件error】
发生错误时触发
客户端
【net.connect(options[, connectionListener])】
【net.createConnection(options[, connectionListener])】
connect()的别名是createConnection()方法
该方法返回一个新的 'net.Socket',并连接到指定的地址和端口。当 socket 建立的时候,将会触发 'connect' 事件。和'net.Socket'有相同的方法
对于 TCP sockets,参数options如下
port: 客户端连接到 Port 的端口(必须)
host: 客户端要连接到得主机。默认 'localhost'
localAddress: 网络连接绑定的本地接口
localPort: 网络连接绑定的本地端口
family : IP 栈版本。默认 4
对于本地域socket,参数options如下
path: 客户端连接到得路径(必须)
var client = net.connect({port: 5000}, function() {});
Socket
【new net.Socket([options])】
构造一个新的 socket 对象
options 对象有以下默认值:
{ fd: null
allowHalfOpen: false,
readable: false,
writable: false
}
参数fd允许指定一个存在的文件描述符。将readable和(或)writable设为true,允许在这个socket上读或写(仅在参数fd有效时)
【socket.connect(port[, host][, connectListener])】
【socket.connect(path[, connectListener])】
使用传入的socket打开一个连接。如果指定了端口port和主机host,TCP socket将打开socket。如果忽略参数host,则默认为localhost。如果指定了path,socket将会被指定路径的unix socket 打开
参数 connectListener 将会作为监听器添加到 'connect' 事件
【socket.write(data[, encoding][, callback])】
在socket上发送数据。第二个参数指定了字符串的编码,默认是UTF8编码
如果所有数据成功刷新到内核缓冲区,返回true。如果数据全部或部分在用户内存里,返回false。当缓冲区为空的时候会触发'drain'
当数据最终被完整写入的的时候,可选的callback参数会被执行,但不一定会马上执行
【socket.end([data][, encoding])】
半关闭socket。例如,它发送一个FIN包。可能服务器仍在发送数据。
如果参数data不为空,等同于调用socket.write(data,encoding)后再调用socket.end()
【socket.destroy()】
确保没有 I/O 活动在这个套接字上。只有在错误发生情况下才需要
【socket.pause()】
暂停读取数据。就是说,不会再触发 data 事件。对于控制上传非常有用
【socket.resume()】
调用 pause() 后想恢复读取数据
【socket.setTimeout(timeout[, callback])】
socket 闲置时间超过 timeout 毫秒后 ,将 socket 设置为超时。触发空闲超时事件时,socket 将会收到 'timeout'事件,但是连接不会被断开。用户必须手动调用 end() 或 destroy() 这个socket。
如果 timeout = 0, 那么现有的闲置超时会被禁用。可选的 callback 参数将会被添加成为 'timeout' 事件的一次性监听器
【socket.setNoDelay([noDelay])】
禁用纳格(Nagle)算法。默认情况下 TCP 连接使用纳格算法,在发送前他们会缓冲数据。将 noDelay 设置为 true 将会在调用 socket.write() 时立即发送数据。noDelay 默认值为 true
【socket.setKeepAlive([enable][, initialDelay])】
禁用/启用长连接功能,在发送第一个在闲置socket上的长连接probe之前,可选地设定初始延时。默认false
设定initialDelay(毫秒),来设定收到的最后一个数据包和第一个长连接probe之间的延时。将 initialDelay 设为0,将会保留默认(或者之前)的值。默认值为0
【socket.address()】
操作系统返回绑定的地址,协议族名和服务器端口。返回的对象有 3 个属性,比如{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
【socket.remoteAddress】
远程的 IP 地址字符串
【socket.remoteFamily】
远程IP协议族字符串
【socket.remotePort】
远程端口,数字表示
【socket.localAddress】
远程客户端正在连接的本地IP地址,字符串表示
【socket.localPort】
本地端口地址,数字表示
【socket.bytesRead】
接收的字节数
【socket.bytesWritten】
发送的字节数
【事件lookup】
在解析域名后,但在连接前,触发这个事件。对 UNIX sokcet 不适用
err {Error | Null} 错误对象
address {String} IP 地址。
family {String | Null} 地址类型
【事件connect】
当成功建立 socket 连接时触发、
【事件data】
{Buffer object}
当接收到数据时触发。参数 data 可以是 Buffer 或 String
当 Socket 触发一个 'data' 事件时,如果没有监听器,数据将会丢失
【事件end】
当 socket 另一端发送 FIN 包时,触发该事件
【事件timeout】
当 socket 空闲超时时触发,仅是表明 socket 已经空闲。用户必须手动关闭连接
【事件drain】
当写缓存为空得时候触发。可用来控制上传
【事件error】
错误发生时触发
【事件close】
had_error {Boolean} 如果 socket 传输错误,为 true
当 socket 完全关闭时触发。参数 had_error 是 boolean,它表示是否因为传输错误导致 socket 关闭
简易服务器
【服务器】
//server.js
var net = require('net') ;
var server = net.createServer(function(socket) {
socket.write("Hi!\n");
socket.on("data", function(data) {
console.log(data.toString());
});
socket.on("end", function() {
console.log('有客户机下线了!!!');
});
socket.on('error', function() {
console.log('发生意外错误!!!');
});
}) ;
server.listen(8080) ;
【客户机】
//client.js
var net = require('net') ;
var client = net.connect({port: 8080},function(){
client.name = '客户机1';
client.write(client.name + ' 上线了!\n');
client.end(client.name + ' 下线了!\n');
client.on("data", function(data) {
console.log(data.toString());
});
});
简易聊天室
【服务器】
//chatServer.js
var net = require('net');
var i = 0;
//保存客户机
var clientList = [];
var server = net.createServer(function(socket) {
socket.name = '用户' + (++i);
socket.write('【聊天室提示】欢迎' + socket.name + '\n');
//更新客户机数组
clientList.push(socket);
function showClients(){
console.log('【当前在线用户】:');
for(var i=0;i<clientList.length;i++) {
console.log(clientList[i].name);
}
}
showClients();
socket.on("data", function(data) {
//把当前连接的客户机的信息转发到其他客户机
for(var i=0;i<clientList.length;i++) {
if(socket !== clientList[i]) {
clientList[i].write('【' + socket.name + '】:' + data);
}
}
});
socket.on("close", function() {
//当前客户机下线时,将其从客户机数组中移除
clientList.splice(clientList.indexOf(socket), 1);
showClients();
});
socket.on('error', function(err) {
console.log(socket.name + '退出');
});
});
server.listen(8080) ;
【客户机】
//chatClient.js
var net = require('net');
process.stdin.resume();
process.stdin.setEncoding('utf8');
var client = net.connect({port: 8080},function(){
console.log('【本机提示】登录到聊天室');
process.stdin.on('data',function(data){
client.write(data);
})
client.on("data", function(data) {
console.log(data.toString());
});
client.on('end', function() {
console.log('【本机提示】退出聊天室');
process.exit();
});
client.on('error', function() {
console.log('【本机提示】聊天室异常');
process.exit();
});
});
nodeJS之TCP模块net的更多相关文章
- nodejs的TCP相关的一些笔记
TCP协议 基于nodejs创建TCP服务端 TCP服务的事件 TCP报文解析与粘包解决方案 一.TCP协议 1.1TCP协议原理部分参考:无连接运输的UDP.可靠数据传输原理.面向连接运输的TCP ...
- 使用nodejs的net模块创建TCP服务器
使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...
- elk系列6之tcp模块的使用
preface tcp模块的使用场景如下: 有一台服务器A只需要收集一个日志,那么我们就可以不需要在这服务器上安装logstash,我们通过在其他logstash上启用tcp模块,监听某个端口,然后我 ...
- 关于Nodejs的多进程模块Cluster
关于Nodejs的多进程模块Cluster 前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...
- Nodejs中cluster模块的多进程共享数据问题
Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...
- nodejs的require模块及路径
在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文 ...
- 使用nodejs的http模块创建web服务器
使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...
- Nodejs的http模块
一.http服务器 我们知道传统的HTTP服务器是由Aphche.Nginx.IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: ...
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
随机推荐
- CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)
题目描述 Brain Network (hard) 这个问题就是给出一个不断加边的树,保证每一次加边之后都只有一个连通块(每一次连的点都是之前出现过的),问每一次加边之后树的直径. 算法 每一次增加一 ...
- JS的块级作用域
今天带来的是 "对<你不知道的js>中块级作用域的总结" 分享: 1)用with从对象中创建出来的作用域只在with声明中而非外部作用域有效,同时可以访问已有对象的属性 ...
- Android Gradle manifestPlaceholders 占位符详解
Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...
- HashMap 学习笔记
先摆上JDK1.8中HashMap的类注释:我翻译了一下 /** * Hash table based implementation of the <tt>Map</tt> i ...
- [进程管理]Load和CPU利用率是如何算出来的
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://www.penglixun.com/tech/system/how_to_ca ...
- J2EE struts2MVC应用在线书签1
序:之前花了一天研究了一下filter,虽然是实现了MVC模式开发了 WebBookmark,但是代码过于冗长,集中在filter中使用if语句不易阅读,为了体现两份作业的不同点,我决定学习 Java ...
- C#基础知识-数据类型(一)
俗话说温故而知新,学习一门知识最好的方法就是不断的去咀嚼回味,学习编程更是如此.对于.NET平台中的C#语言而言,有着强大的类库.不断的在更新迭代几乎每隔一年都会更新一个新的模块,.NET Framw ...
- Docker基于已有的镜像制新的镜像
1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAI ...
- JavaScript知识点整理(一)
JavaScript知识点(一)包括 数据类型.表达式和运算符.语句.对象.数组. 一.数据类型 1) js中6种数据类型:弱类型特性 5种原始类型:number(数字).string(字符串).bo ...
- XAF_GS_01_准备环境
各位久等了,接下来我们开始学习XAF入门的第一节,搭建XAF的环境 Setp 1 第一步不是创建什么项目,而是先安装我们的XAF环境也就是安装DevExpress 由于笔者安装的是16.2.3所以演示 ...