Node 之 构建TCP服务器

OSI参考模型将网络通信功能划分为7层,即物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。TCP协议就是位于传输层的协议。Node.js在创建一个TCP服务器的时候使用的是net(网络)模块。

使用Node.js创建TCP服务器,首先要使用require(‘net’)来加载net模块,之后使用net模块的createServer方法就可以创建一个TCP服务器.

net.createServer([options],[connectionListener])
  • options是一个对象参数值,有两个布尔类型的属性allowHalfOpen和pauseOnConnect,这两个属性默认都是false。
  • connectionListener是一个当客户端与服务器端建立链接时的回调函数,这个回调函数以socket端口对象作为参数

下面代码构建一个TCP服务器:

//引入net模块
var net=require(‘net‘);
//创建TCP服务器
var server=net.createServer(function(socket){

    console.log(‘someone connets‘);

})

监听客户端的连接

使用TCP服务器的listen方法就可以开始监听客户端的连接:

server.listen(port[,host][,backlog][,callback]);
  • port参数为需要监听的端口号,参数值为0的时候将随机分配一个端口号。
  • host为服务器地址。
  • backlog为等待队列的最大长度
  • callback为回调函数

下面代码创建一个TCP服务器并监听18001端口:

//引入net模块
var net=require(‘net‘);
//创建TCP服务器
var server=net.createServer(function(socket){

    console.log(‘someone connets‘);

})
server.listen(18001,function(){

    console.log(‘server is listening‘);
});

当在浏览器中输入http://localhost:18001/,连接成功后就会打印出someone connets字样,表明createServer方法的回调函数已经执行,说明已经成功连接这个TCP服务器。

server.listen()方法其实触发的是server下的listening事件,所以可以手动监听listening事件。

下面代码同样实现创建一个TCP服务器并监听18001端口的作用。

//引入net模块
var net=require(‘net‘);
//创建TCP服务器
var server=net.createServer(function(socket){

    console.log(‘someone connets‘);

})

//设置监听端口
server.listen(18001);

//设置监听时的回调函数
server.on(‘listen‘,function(){
    console.log(‘server is listening‘);
})

除listening事件外,TCP服务器还支持以下事件:

  • connection:当前新的链接创建时触发,回调函数的参数为socket连接对象。
  • close:TCP服务器关闭的时候触发,回调函数没有参数
  • error:TCP服务器发生错误的时候触发,回调函数的参数为error对象

在下面代码中将通过net.Server类创建一个TCP服务器,添加以上的事件:

//引入net模块
var net=require(‘net‘);

//实例化一个服务器对象
var server=new net.Server();
//监听connection事件
server.on(‘connection‘,function(){
    console.log(‘someone connets‘);
});

//创建TCP服务器
var server=net.createServer(function(socket){

    console.log(‘someone connets‘);

});

//设置监听端口
server.listen(18001);

//设置监听时的回调函数
server.on(‘listen‘,function(){
    console.log(‘server is listening‘);
});

//设置关闭时的回调函数
server.on(‘close‘,function(){
    console.log(‘sever closed‘);
});

//设置出错时的回调函数
server.on(‘error‘,function(){
    console.log(‘error‘);
});

查看服务器监听的地址

在创建一个TCP服务器之后可以通过server.address()方法来查看这个TCP服务器监听的地址,并返回一个json对象,这个对象的属性有:

  • port:TCP服务器监听的端口号;
  • family:说明监听的地址是IPV6还是IPV4
  • address:TCP服务器监听的地址。

因为这个方法返回的是TCP服务器监听的地址信息,因此,这个方法应该在使用server.listen()方法或者绑定事件listening中的回调函数中的使用。

//引入net模块
var net=require(‘net‘);
//创建服务器
var server=net.createServer(function(socket){
    console.log(‘someone connets‘);

});

//设置监听端口
server.listen(18001,function(){

    //获取地址信息
    var address=server.address();
    //获取地址端口
    console.log(‘the port of server is‘+address.port);
    console.log(‘the address of server is‘+address.address);

    console.log(‘the family of server is‘+address.family);
})

结果显示:

连接服务器的客户端数量

在创建一个TCP服务器的基础下,可以通过server.getConnection()方法获取连接这个TCP服务器的客户端数量。这个方法是一个异步的方法,回调这个函数有两个参数:

  • 第一个参数为error对象
  • 第二个参数为连接TCP服务器的客户端数量。

除了获取连接数量外,也可以通过设置TCP服务器的maxConnections属性来设置这个TCP服务器最大连接数量。如果当连接的数量超过最大的数量的时候,服务器会拒绝新的连接。

在下面的代码中设置创建这个TCP服务器的最大连接数量为3:

var net=require(‘net‘);
//创建服务器
var server=net.createServer(function(socket){

    console.log(‘someone connects‘);
    //设置连接最大数量
    server.maxConnection=3;

    server.getConnections(function(err,count){

        console.log(‘the count of clieent is‘+count);

    });
});
//设置监听端口
server.listen(18001,function(){

    console.log(‘server is listening‘);
});

运行上面这段代码,并尝试用多个客户端连接,可以发现当客户端的连接数量超过3的时候,新的客户端无法连接这个服务器。

获取客户端发送的数据

在上面我们提到了createServer/方法的回调函数参数是一个net.Socket对象(服务器所监听的端口对象),这个对象同样也有一个address()方法,用来获取TCP服务器绑定的地址,同样也返回一个含有port、family、address属性的对象。

socket对象可以用来获取客户端发送的流数据,每次接收到的数据的时候触发data事件,通过监听这个事件就可以在回调函数中获取客户端发送的数据。

代码:

var net=require(‘net‘);

//创建服务器
var server=net.createServer(function(socket){
    //监听dada事件
    socket.on(‘data‘,function(data){

        //打印data
        console.log(data.toString());
    });
});
 //设置监听端口
server.listen(18001,function(){

    console.log(‘server is listening‘);
});

效果显示是在Google Chrome浏览器中输入http://localhost:18001/打印出的信息,我们可以通过Telnet等工具连接后,发送一段数据给服务端,在命令行中就可以发现数据被打印出来:

获取客户端数据的效果:

socket对象除了有data事件外,还有connect,end、error、timeout等事件。

发送数据给客户端

使用socket.write()可以使TCP服务器发送数据。这个方法只有一个必须参数,就是需要发送的数据;第二个参数为编码格式,可选,同时,可以为这个方法设置一个回调函数,当有用户连接TCP服务器的时候,将发送数据给客户端

代码:

var net=require(‘net‘);

//创建服务器
var server=net.createServer(function(socket){

    //获取地址信息
    var address=server.address();
    var message=‘client,the server address is‘+JSON.stringify(address);
    //发送数据
    socket.write(message,function(){

        var writeSize=socket.bytesWritten;

        console.log(message+‘has send‘);
        console.log(‘the size of message is‘+writeSize);
    });

    //监听dada事件
    socket.on(‘data‘,function(data){

        //打印data
        console.log(data.toString());
        var readSize=socket.bytesRead;
        console.log(‘the size of data is‘+readSize);
    });
});
 //设置监听端口
server.listen(18001,function(){

    console.log(‘server is listening‘);
});

运行这段代码并连接TCP服务器,可以看到Telnet中收到了TCP服务器发送的数据,Telnet也可以发送数据给TCP服务器:

在上面这段代码中还用到了socket对象的bytesWritten和byteRead属性,这两个属性分别代表着发送数据的字节数和接收数据的字节数。

原文地址:https://www.cnblogs.com/jiguiyan/p/11221500.html

时间: 2024-08-05 16:47:47

Node 之 构建TCP服务器的相关文章

Node.js 构建TCP服务

构建TCP服务 三次握手连接: 1.客户端请求连接 2.服务器响应 3.开始传输 服务端 // 构建TCP服务 服务端 const net = require('net') const server = net.createServer() server.on('connection', clientSocket => { console.log('有新的客户端连接了') //服务端通过 clientSocket 监听 data 事件 clientSocket.on('data', data =

使用OTP原理构建一个非阻塞的TCP服务器(转)

经测试可用! 原文地址:http://www.iucai.com/?paged=8 Erlang OTP设计原理已经被shiningray兄翻译透了.请参见.http://erlang.shiningray.cn/otp-design-principles/index.html 这里翻译了一篇余锋老大和lzy.je老大推荐的文章,闲话不说,奉上. 使用OTP原理构建一个非阻塞的TCP服务器 原文网址:(打不开的同学请自觉FQ) http://www.trapexit.org.nyud.net:8

使用.net core在Ubuntu构建一个TCP服务器

介绍和背景 TCP编程是网络编程领域最有趣的部分之一.在Ubuntu环境中,我喜欢使用.NET Core进行TCP编程,并使用本机Ubuntu脚本与TCP服务器进行通信.以前,我在.NET框架本身写了一篇关于TCP服务器和客户端的文章.现在,.NET框架本身将是开源的.我想写一些关于他们之间的沟通渠道.基本上,我只是测试在新的.NET环境下工作的情况,而不是在旧的.NET框架环境中工作. 然而,在这篇文章中,我有一大堆的额外功能可供你使用.我将向您展示您将使用的方法来构建自己的TCP服务器,使用

教你构建iSCSI服务器实现SAN存储模型

iSCSI(Internet Small Computer System Interface)Internet 小型计算机系统接口,是一种基于 TCP/IP的协议,用来建立和管理 IP 存储设备.主机和客户机等之间的相互连接,并创建存储区域网络(SAN).SAN 使得 SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行. SCSI 结构基于客户/服务器模式,其通常应用环境是:设备互相靠近,并且这些设备由 SCSI 总线连接.iSC

使用Vert.x构建Web服务器和消息系统

如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.js出现,许多开发者兴奋的感到可以用不寻常的方法来构建可扩展的服务器端应用程序. 而不是开始,将服务使用多线程的请求重量级的容器.Node.js是启动多个轻便单线程的服务器和流量路由到他们. 现在,类似的框架已经出现,它的服务器部署在一个JVM中,使用JVM设施来管理流量轻量级服务器进程. 本批中的开

了不起的Node.js--之五 TCP连接

TCP连接 传输控制协议(TCP)是一个面向连接的协议,它保证了两台计算机之间数据传输的可靠性和顺序. TCP是一种传输层协议,它可以让你将数据从一台计算机完整有序地传输到另一台计算机. Node.js这个框架的出发点就是为了网络应用开发所设计的.如今,网络应用都是用TCP/IP协议进行通信的. Node Http服务器是构建于Node TCP服务器之上的.从编程角度来说,也就是Node中得http.Server继承自net.Server(net是TCP模块). TCP有哪些特性 TCP的首要特

rsyslog + mysql + loganalyzer 构建日志服务器

rsyslog支持的特性 支持多线程 支持tcp,ssl,tls.relp 可以把日志存储于关系型数据库中 支持过滤器,可以实现过滤日志中的任意部分. 支持自定义格式 适用于企业级的日志记录需求. 功能模块化 rsyslog用facility接收各个应用和程序的日志,并把日志分类.有以下几类 auth        与认证相关的 authpriv 与用户认证授权相关的,如用户登陆 cron     与周期任务相关的 daemon    与守护进程相关的 kern        与内核相关的 lp

使用webpack构建本地服务器

想不想让你的浏览器监测你代码的修改,并自动刷新修改后的结果,其实Webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的这些功能,不过它是一个单独的组件,在webpack中进行配置之前需要单独安装它作为项目依赖 npm install webpack-dev-server –g  在package.json里配置: "dev": "webpack-dev-server --port 8080 --colors --progress -

Netty构建Http服务器

Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议.Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发.Netty 已逐渐成为 Java NIO 编程的首选框架,Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,因此我们在构建Http服务器的时候就是通过Htt