zoukankan      html  css  js  c++  java
  • 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属性,这两个属性分别代表着发送数据的字节数和接收数据的字节数。

  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/jiguiyan/p/11221500.html
Copyright © 2011-2022 走看看