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

  • 相关阅读:
    数据结构与算法分析视频教程全集
    NodeJS测试实例
    从信用卡欺诈模型看不平衡数据分类(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RF、xgboost、神经网络能够取得非常不错的效果。(2)模型层面:使用模型集成,样本不做处理,将各个模型进行特征选择、参数调优后进行集成,通常也能够取得不错的结果。(3)其他方法:偶尔可以使用异常检测技术,IF为主
    kaggle 欺诈信用卡预测——Smote+LR
    kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了
    leetcode 437. Path Sum III
    cluster KMeans need preprocessing scale????
    神经网络结构设计 不一定是第一层神经元是输入维度数
    How to handle Imbalanced Classification Problems in machine learning?
    Using SMOTEBoost(过采样) and RUSBoost(使用聚类+集成学习) to deal with class imbalance
  • 原文地址:https://www.cnblogs.com/jiguiyan/p/11221500.html
Copyright © 2020-2023  润新知