在日常开发中我们使用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。
此时发生的事情是这样的:
- (客户端)和服务端连接成功,调用net.connect的回调函数,在控制台输出
client connect!,然后调用write向服务端传输数据。 - (服务端)和客户端连接成功后,立马调用write发送
来自serever的数据 1,然后监听到客户端发送来的数据触发onData事件,打印出接收到的数据data from client: 来自客户端的数据。然后向客户端发送来自serever的数据 2。 - (客户端)触发onData事件接收到
来自serever的数据 1,然后调用client.end,调用end后不会立即关闭连接,会进行4次挥手,等到所有的数据都接收完成,所以还会再触发一次onData事件接收到数据来自serever的数据 2。 - (服务端)触发onEnd事件
- (客户端)触发onEnd事件