net 基本使用

82 阅读2分钟

1. 使用net发出请求

1.1 连接服务器

const net = require("net")
​
const PORT = 80
const HOST = "baidu.com"
/**
 * 第一步,与服务器建立连接,这一步对应着 tcp 连接的握手阶段
 * 
 * 1. 客户端通过 connect() 调用向服务端发送 SYN 以希望建立连接,此刻客户端进入 SYN_SENT 状态
 * 
 * 2. 服务端收到客户端的 SYN 请求后,会给客户端发送 SYN + ACK,此刻服务端进入 SYN_RCVD 状态;
 * 
 * 3. 客户端收到服务端的 SYN + ACK 响应后,会给服务端发送 ACK,
 * 此刻客户端与服务端(在收到客户端的 ACK 确认后)分别进入 ESTABLISH 状态。
 * 
 * 一旦完成上述的三个步骤,客户端和服务端之间就可以相互发送包括数据的报文段了。
 **/
const socketStream = net.createConnection(
  {
    host: HOST,
    port: PORT,
  },
  () => {
    console.log(`端口:${PORT} 主机:${HOST} 连接成功`)
  }
)
const net = require("net")
​
const PORT = 80
const HOST = "baidu.com"
const socketStream = net.createConnection(PORT, HOST)
socketStream.on("connect", () => {
  console.log(`端口:${PORT} 主机:${HOST} 连接成功`)
})

1705455501445.png

1.2 发送请求报文

socketStream.write("发送的消息")
1.2.1 发出http请求报文

http 请求格式

请求方法 url 协议版本\r\n  <= 请求行
头部字段名1:头部字段值1\r\n <= 请求头
头部字段名2:头部字段值2\r\n
\r\n
请求正文  <= 请求体
`GET / HTTP/1.1
Host: baidu.com
Connection: keep-alive
​
`
"GET / HTTP/1.1\r\nHost: baidu.com\r\nConnection: keep-alive\r\n\r\n"
"GET / HTTP/1.1\r\n" +
"Host: baidu.com\r\n" +
"Connection: keep-alive\r\n" +
"\r\n"

2. 使用 net 创建 tcp 服务器

const net = require("net")
const server = net.createServer()
​
const PORT = 8080
const HOST = "localhost"
server.listen(PORT)
server.on("listening", () => {
  console.log(`---------------->http://${HOST}:${PORT} Server is ready!`)
})
​
// 客户端连接成功的调用
server.on('connection', (socket)=> {
    console.log("客户端连接完成");
    socket.on('data', (chunk) => {
        console.log('客户端发来的信息', chunk.toString('utf-8'));
        const Buf = Buffer.from(`HTTP/1.1 200 OK
Content-Type: html/text
​
你好
`, 'utf-8');
        socket.write(Buf);
        socket.end();
    });
  
});
const net = require('net');
​
const server = net.createServer((socket) => {
  // 客户端连接成功的调用
  socket.on('data', (data) => {
    console.log(`Server: ${data}!`);
    socket.write(data);
  });
​
  socket.on('close', () => {
    console.log('Server: connection is closed!');
  });
})
​
const PORT = 8080
const HOST = "localhost"
server.listen(PORT, HOST, () => {
  console.log(`---------------->http://${HOST}:${PORT} Server is ready!`)
});

客户端连接的socket 调用 end 方法,会主动触发 close 事件

clientSocket.end();
​
clientSocket.on('close', () => {
  console.log('Server: connection is closed!');
});