node创建tcp服务器

152 阅读2分钟

在日常开发中我们使用express、koa等框架来搭建node服务,这些框架帮我们封装好了底层的逻辑,了解底层逻辑有助于我们更好地理解node服务,本文通过一个简单的例子了解如何用node搭建tcp服务。

node提供了一个核心模块net,通过net可以简单的搭建一个tcp服务。

tcp服务代码如下:

// server.js

const net = require('net');

const server = net.createServer(socket => {
    socket.on('data', data => {
        console.log('data from client', data.toString());
        socket.write('来自serever的数据 2');
    })

    socket.on('end', () => {
        console.log('连接断开');
    });

    socket.write('来自serever的数据 1');
});

server.listen(8111, () => {
    console.log('tcp服务启动成功');
});

我们通过net.createServer来创建tcp服务,创建好服务后再调用listen来监听对应端口。net.createServer接收一个函数,函数的参数是一个套接字(socket),socket.on('data', data => {})可以监听来自客户端的数据传输,socket.on('end', () => {})可以监听来自客户端的关闭事件。socket.write可以向客户端传输数据。

这个时候我们在终端输入node server.js就可以启动node服务了。

然后我们再来编写客户端的代码,node的net模块提供了我们创建客户端的api,代码如下:

const net = require('net');

const client = net.connect({ port: 8111 }, () => {
    console.log('client connect!');
    client.write('来自客户端的数据');
});

client.on('data', data => {
    console.log('data from server: ', data.toString());
    client.end();
});

client.on('end', () => {
    console.log('connect end');
});

通过net.connet可以创建客户端程序,同时用于指定连接的port。client和server一样也提供write、onData、onEnd的方法。

我们再起一个终端输入node client.js

此时发生的事情是这样的:

  1. (客户端)和服务端连接成功,调用net.connect的回调函数,在控制台输出client connect!,然后调用write向服务端传输数据。
  2. (服务端)和客户端连接成功后,立马调用write发送来自serever的数据 1,然后监听到客户端发送来的数据触发onData事件,打印出接收到的数据data from client: 来自客户端的数据。然后向客户端发送来自serever的数据 2
  3. (客户端)触发onData事件接收到来自serever的数据 1,然后调用client.end,调用end后不会立即关闭连接,会进行4次挥手,等到所有的数据都接收完成,所以还会再触发一次onData事件接收到数据来自serever的数据 2
  4. (服务端)触发onEnd事件
  5. (客户端)触发onEnd事件