使用node构建tcp服务demo

47 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

构建TCP服务

TCP

tcp全面 传输控制协议 ,在OSI模型中属于传输层协议。部分应用层协议基于TCP构建,如:HTTP、SMTP、IMAP。tcp是面向连接的(udp则不是面向连接,这是它们间的一大区别),显著特征则是在传输数据前需要建立会话。会话创建过程中,服务端与客户端分别提供一个套接字,这两个套接字共同形成一个连接。

创建TCP服务

接下来创建一个TCP服务器接受网络请求,代码如下

 const net = require("net");
 const server = net.createServer((socket) => {
     socket.on("data", (data) => {
         console.log("🚀 接收来自客户端的信息:", data.toString()); // 传输的是二进制数据,需要转成utf-8输出
         socket.write("你好,我是服务器");
     });
     socket.on("end", () => {
         console.log("连接断开");
     });
     socket.on("error", (err) => {
         console.log("err", err);
     });
 ​
     socket.write("欢迎光临");
 });
 server.listen(8124, () => {
     console.log(`server is running`);
 });

可以使用 telnet 工具做为客户端对刚才创建的tcp服务进行交流,代码如下:

 shengjingyin@1097-ShengJY-WS:~$ telnet 127.0.0.1 8124
 Trying 127.0.0.1...
 Connected to 127.0.0.1.
 Escape character is '^]'.
 欢迎光临
 你好,我是服务器

也可以自行创建客户端服务与服务端进行会话,代码如下:

 const net = require("net");
 ​
 const client = net.connect({ port: 8124 }, (...args) => {
     console.log("与服务器连接成功", args);
     client.write("你好,我是客户端");
 });
 ​
 client.on("data", (data) => {
     console.log("🚀 接收来自服务器的信息:", data.toString()); // 传输的是二进制数据,需要转成utf-8输出
     client.end();
 });
 ​
 client.on("end", (data) => {});
 ​

执行客户端服务后,可以看到:

image-20221126102440817

TCP服务中的事件

服务器事件

通过 net.createServer 创建的服务器,它是一个EventEmitter 实例,它的自定义事件有如下几种:

image-20221126104628347

  • close:服务器关闭时触发
  • error:服务异常触发,如果没有监听这个,那么出现异常将直接抛出
  • connection:客户端套接字连接到服务器时触发
  • listening:绑定端口后触发,简写:作为 server.listen(8124, listeningListener) 的第二个参数

连接事件

服务器可以同时连接多个客户端(可以使用多个telnet试试),每个连接都是可写可读 Stream 对象, Stream 对象用于服务器与客户端间通信,可以通过data事件接收另一端发来的消息,也可以通过 write() 方法向对方发送数据。

image-20221126105556027

  • close:套接字完全关闭之后触发
  • connect:连接成功时触发
  • data:用来接收数据的,传递数据需要用write方法
  • drain:调用write发送数据后,执行该方法(我在客户端发送数据后,暂未触发)
  • end:任意端发送FIN数据,触发(怎么发送)
  • error:异常触发
  • lookup:在解析主机名之后但在连接之前发出
  • ready:当套接字准备好使用时发出
  • timeout:闲置触发