利用node的net模块实现简单的http协议

173 阅读3分钟

net模块是Node.js的核心模块之一,它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端,以及处理网络通信。

image.png

TCP协议位于传输层。在OSI七层网络模型中,传输层是第四层,它负责提供端到端的数据传输服务,并控制数据传输的可靠性、顺序、流量和错误处理等方面。TCP(传输控制协议)正是为了提供这样的端到端可靠传输服务而设计的。在TCP/IP协议簇中,TCP位于第三层,对应于OSI模型中的第四层。

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,用于在计算机网络上进行数据传输。它是互联网协议套件(TCP/IP)的一部分,是应用层和网络层之间的传输层协议。

TCP的主要特点包括:

  1. 可靠性:TCP通过使用确认机制、序列号和重传策略来确保数据的可靠传输。它可以检测并纠正数据丢失、重复、损坏或失序的问题。

  2. 面向连接:在进行数据传输之前,TCP需要在发送方和接收方之间建立一个连接。连接的建立是通过三次握手来完成的,确保双方都准备好进行通信。

  3. 全双工通信:TCP支持双方同时进行双向通信,即发送方和接收方可以在同一时间发送和接收数据。

  4. 流式传输:TCP将数据视为连续的字节流进行传输,而不是离散的数据包。发送方将数据划分为较小的数据块,但TCP在传输过程中将其作为连续的字节流处理。

  5. 拥塞控制:TCP具备拥塞控制机制,用于避免网络拥塞和数据丢失。它通过动态调整发送速率、使用拥塞窗口和慢启动算法等方式来控制数据的发送速度

场景

  1. 服务端之间的通讯

服务端之间的通讯可以直接使用TCP通讯,而不需要上升到http层

server.js

创建一个TCP服务,并且发送套接字,监听端口号3000

js
复制代码
import net from 'net'


const server = net.createServer((socket) => {
   setInterval(()=>{
       socket.write('XiaoMan')
   },1000)
})
server.listen(3000,()=>{
    console.log('listening on 3000')
})

client.js 连接server端,并且监听返回的数据


mport net from 'net'

const client = net.createConnection({
    host: '127.0.0.1',
    port: 3000,
})

client.on('data', (data) => {
    console.log(data.toString())
})
  1. 从传输层实现http协议

创建一个TCP服务

import net from 'net'


const http = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log(data.toString())
    })
})
http.listen(3000,()=>{
     console.log('listening on 3000')
})

net.createServer创建 Unix 域套接字并且返回一个server对象接受一个回调函数

socket可以监听很多事件

  1. close 一旦套接字完全关闭就触发
  2. connect 当成功建立套接字连接时触发
  3. data 接收到数据时触发
  4. end 当套接字的另一端表示传输结束时触发,从而结束套接字的可读端

通过node http.js 启动之后我们使用浏览器访问一下

image.png

可以看到浏览器发送了一个http get 请求 我们可以通过关键字get 返回相关的内容例如html

import net from "net";

const html = `<h1>TCP  made by kevin</h1>`;

const responseHeaders = [
  "HTTP/1.1 200 OK",
  "Content-Type:text/html",
  "Content-Length: " + html.length,
  "\r\n",
  html,
];
const http = net.createServer((socket) => {
  socket.on("data", (e) => {
    console.log(e.toString());
    if (/GET/.test(e.toString())) {
      socket.write(responseHeaders.join("\r\n")); 
      //**HTTP协议的格式**:HTTP协议要求头部字段之间使用回车(`\r`)和换行(`\n`)字符(即 `\r\n`)来分隔。这是HTTP消息格式的一部分,用于区分不同的头部字段以及头部和正文之间的边界。
      socket.end();
    }
  });
});

http.listen(80, () => {
  console.log("server is listencing on port 80");
});

打开浏览器后 访问localhost ,出现如下页面 image.png