美文网首页node我爱编程Nodejs、TypeScript和Vuejs
Node.js构建TCP服务器和TCP客户端

Node.js构建TCP服务器和TCP客户端

作者: 张成的开发笔记 | 来源:发表于2018-03-30 20:47 被阅读1255次

    网络是通信互联网的基础,Node.js提供了net、http、dgram模块、分别用来实现TCP、HTTP、UDP的通信。上次的文章《Node.js构建HTTP服务器》实现了HTTP的通信,这篇文章说一说TCP服务器和TCP客户端的构建。

    用Node.js创建TCP服务器

    构建TCP服务器

    为了使用Node.js创建TCP服务器,首先要使用require("net")来加载net模块,然后使用net模块的createServer方法就可以轻松地创建一个TCP服务器。

    /**
     * 构建TCP客户端
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 创建TCP服务器 */
    var server = net.createServer(function(socket){
        console.log('someone connects');
    })
    
    /* 设置连接的服务器 */
    server.listen(8000, function(){
        console.log("Creat server on http://127.0.0.1:8000/");
    })
    

    运行这段代码并访问了http://127.0.0.1:8000/的话会看到控制台打印了"someone connects",表明已经成功连接到这个创建的TCP服务器。


    /* 设置连接的服务器 */
    server.listen(8000, function(){
    ​ console.log("Creat server on http://127.0.0.1:8000/");
    })

    上面这段代码实际上触发的是server下的listening事件,等同于:

    /* 设置监听端口 */

    server.listen(8000);

    /* 设置监听时的回调函数 */

    server.on("listening", function () {

    ​ console.log("Creat server on http://127.0.0.1:8000/");

    })

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

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

    下列代码通过net.Server类来创建一个TCP服务器,并添加以上事件。

     /**
     * 通过net.Server类来创建一个TCP服务器
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 实例化一个服务器对象 */
    var server = new net.Server();
    
    /* 监听 connection 事件 */
    server.on("connection", function (socket) {
        console.log("someone connects");
    });
    
    /* 设置监听端口 */
    server.listen(8000);
    
    /* 设置监听时的回调函数 */
    server.on("listening", function () {
        console.log("Creat server on http://127.0.0.1:8000/");
    })
    
    /* 设置关闭时的回调函数 */
    server.on("close", function () {
        console.log("server closed!");
    })
    
    /* 设置错误时的回调函数 */
    server.on("error", function (err) {
        console.log("error!");
    })
    

    查看服务器监听的地址

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

    1. port:TCP服务器监听的端口号
    2. family:说明TCP服务器监听的地址是 IPv6 还是 IPv4
    3. address:TCP服务器监听的地址
    /**
     * 查看服务器监听的地址
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 创建TCP服务器 */
    var server = net.createServer(function(socket){
        console.log('someone connects');
    })
    
    /* 获取地址信息 */
    server.listen(8000,function(){
        /* 获取地址信息,得到的是一个json { address: '::', family: 'IPv6', port: 8000 } */
        var address = server.address();
        
        /* TCP服务器监听的端口号 */
        console.log("the port of server is"+ address.port);
    
        /* TCP服务器监听的地址 */
        console.log("the address of server is"+ address.address);
    
        /* 说明TCP服务器监听的地址是 IPv6 还是 IPv4 */
        console.log("the family of server is"+ address.family);
    })
    

    连接服务器的客户端数量

    创建一个TCP服务器后,可以通过server.getConnections()方法获取连接这个TCP服务器的客户端数量。除此之外,也可以通过maxConnections属性来设置这个服务器的最大连接数量,当连接数量超过最大值时,服务器将拒绝新的连接。

    /**
     * 连接服务器的客户端数量
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 创建TCP服务器 */
    var server = net.createServer(function(socket){
        console.log('someone connects');
    
        /* 设置最大连接数量 */
        server.maxConnections=3;
        server.getConnections(function(err,count){
            console.log("the count of client is "+count);
        })
    })
    
    /* 获取监听端口 */
    server.listen(8000,function(){
        console.log("Creat server on http://127.0.0.1:8000/");
    })
    

    你可以打开多个网页输入localhost:8000来测试这段代码,也可以用Telnet命令 telnet localhost 8000 来连接这个TCP服务器(上一篇文章有提到如何用Homebrew安装Telnet:《Homebrew》)。

    image

    服务器和客户端之间的通信

    利用socket.write()可以使TCP服务器发送数据给客户端;

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

    /**
     * 发送和获取
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 创建TCP服务器 */
    var server = net.createServer(function(socket){
        /* 获取地址信息 */
        var address = server.address();
        var message = "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);
        })
    
        /* 监听data事件 */
        socket.on('data',function(data){
            console.log(data.toString());
            var readSize = socket.bytesRead;
            console.log("the size of data is"+readSize);
        })
    })
    
    /* 获取地址信息 */
    server.listen(8000,function(){
        console.log("Creat server on http://127.0.0.1:8000/");
    })
    

    下图中TCP服务器给客户端发送了字符串:

    the server address is{"address":"::","family":"IPv6","port":8000}has send

    客户端给TCP服务器发送了字符串 hello TCP! 和字节数。

    image

    用Node.js创建TCP客户端

    构建TCP客户端

    上面说到用打开网页或者Telnet来访问TCP服务器,其实我们也可以用Node.js来构建一个TCP客户端,实现TCP客户端和TCP服务器的通信。

    为了使用Node.js创建TCP客户端,首先要使用require("net")来加载net模块,然后创建一个连接TCP客户端的socket对象即可:

    /* 引入net模块 */

    var net = require("net");

    /* 创建TCP客户端 */

    var client = net.Socket();

    创建完socket对象后,使用socket对象的connect方法就可以连接一个TCP服务器。

    /**
     * 构建TCP客户端
     */
    
    /* 引入net模块 */
    var net = require("net");
    
    /* 创建TCP客户端 */
    var client = net.Socket();
    
    /* 设置连接的服务器 */
    client.connect(8000, '127.0.0.1', function () {
        console.log("connect the server");
    
        /* 向服务器发送数据 */
        client.write("message from client");
    })
    
    /* 监听服务器传来的data数据 */
    client.on("data", function (data) {
        console.log("the data of server is " + data.toString());
    })
    
    /* 监听end事件 */
    client.on("end", function () {
        console.log("data end");
    })
    

    TCP客户端和TCP服务器的通信

    运行 <a href="#服务器和客户端之间的通信">这段代码</a> 之后再运行 <a href="#构建TCP客户端">这段代码</a> ,可以发现服务器已经接收到客户端的数据,客户端也已经接收到服务端的数据。

    image

    LINK

    1. 本章github源码:https://github.com/zc95/nodeTest/tree/master/TCP
    2. 《Node.js构建HTTP服务器》:https://zc95.github.io/2018/03/19/nodejs-HTTP/
    3. 用Homebrew安装Telnet:https://zc95.github.io/2018/03/20/Homebrew/

    相关文章

      网友评论

        本文标题:Node.js构建TCP服务器和TCP客户端

        本文链接:https://www.haomeiwen.com/subject/nnqwcftx.html