开启掘金成长之旅!这是我参与「掘金日新计划 · 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) => {});
执行客户端服务后,可以看到:
TCP服务中的事件
服务器事件
通过 net.createServer
创建的服务器,它是一个EventEmitter 实例,它的自定义事件有如下几种:
- close:服务器关闭时触发
- error:服务异常触发,如果没有监听这个,那么出现异常将直接抛出
- connection:客户端套接字连接到服务器时触发
- listening:绑定端口后触发,简写:作为
server.listen(8124, listeningListener)
的第二个参数
连接事件
服务器可以同时连接多个客户端(可以使用多个telnet试试),每个连接都是可写可读 Stream 对象, Stream 对象用于服务器与客户端间通信,可以通过data事件接收另一端发来的消息,也可以通过 write()
方法向对方发送数据。
- close:套接字完全关闭之后触发
- connect:连接成功时触发
- data:用来接收数据的,传递数据需要用write方法
- drain:调用write发送数据后,执行该方法(我在客户端发送数据后,暂未触发)
- end:任意端发送FIN数据,触发(怎么发送)
- error:异常触发
- lookup:在解析主机名之后但在连接之前发出
- ready:当套接字准备好使用时发出
- timeout:闲置触发