node.js-net模块

http请求

  • 普通模式
  • 长连接模式

net模块

net是一个通信模块

可以实现:

  • 进程间的通信 IPC
  • 网络通信 TCP/IP

创建客户端

net.createConnection(options[,connectListener])

返回:socekt:

  • socket是一个特殊的文件
  • 在node中表现为一个双工流对象
  • 通过向流写入内容发送数据
  • 通过监听流的内容获取数据
js 复制代码
const net = require("net");
const socket = net.createConnection(
  {
    host: "duyi.ke.qq.com",
    port: 80
  },
  () => {
    console.log("连接成功");
  }
);

var recieve = null;
/**
*提炼出响应字符串的消息头和消息体
* @param {*} response
*/

function parseResponse(response) {
    const index = response.indexOf("\r\n\r\n");
    const head = response.substring(0, index);
    const headParts = head.split("\r\n");
    const headerArray = headParts.slice(1).map(str => {
    return str.split(":").map(s => s.trim());
   });
   const header = headerArray.reduce((a, b) => {
    a[b[0]] = b[1];
    return a;
   }, {});
    const body = response.substring(index).trimStart();

    console.log("head", header);
    console.log("body", body.substring(0, 100));
}

function isOver() {
    // 需要接收的消息体的总字节数
    const contentLength = receive.head["Content-Length"];
    const curReceivedLength = Buffer.from(receive.body, "utf-8").byteLength;
    console.log("contentLength:", curReceivedLength);
    return curReceivedLength > contentLength;
}

socket.on("data", chunk => {
    const response = chunk.toString("utf-8");
    if (!receive) {
    //第一次
        receive = parseResponse(response);
        if (isOver()) {
            socket.end();
        }
        return;
    }
    receive.body += response;
    if(isOver()) {
      sockert.end();
      return;
    }
});

//socket.write{`请求行
//请求头
//
//请求体`);

socket.write(`GET / HTTP/1.1
Host: duyi.ke.qq.com
Connection: keep-alive

`);

socket.on("close", () => {
    console.log("结束了!");
});

创建服务器

net.createServer()

返回server对象

server.listen(port)

  • 启动服务器并监听指定的端口号 port。
  • 服务器开始等待来自客户端的连接。

server.on("listen",()=>{})

  • 监听 listen 事件,当服务器成功启动并开始监听端口时触发。
  • 可以在此回调函数中执行一些初始化操作,例如打印日志。

server.on("connection",socket=>{})

  • 当某个连接到来时,触发该事件
  • 监听 connection 事件,当有客户端连接到服务器时触发。
  • 事件的监听会获得一个socket对象

示例:

js 复制代码
const net = require("net");

// 创建 TCP 服务器
const server = net.createServer();

// 监听指定端口
const port = 3000;
server.listen(port);

// 监听 "listen" 事件
server.on("listen", () => {
    console.log(`服务器已启动,正在监听端口 ${port}`);
});

// 监听 "connection" 事件
server.on("connection", socket => {
    console.log("有客户端连接:", socket.remoteAddress, socket.remotePort);

    // 监听客户端发送的数据
    socket.on("data", data => {
        console.log("接收到客户端数据:", data.toString());
        socket.write("服务器已收到数据"); // 向客户端发送响应
    });

    // 监听客户端断开连接
    socket.on("close", () => {
        console.log("客户端已断开连接");
    });

    // 监听错误
    socket.on("error", err => {
        console.error("连接出错:", err);
    });
});

// 监听服务器错误
server.on("error", err => {
    console.error("服务器出错:", err);
});
相关推荐
福兮说6 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理6 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6667 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)7 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan8 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_8 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒8 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技9 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu9 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
niyongsheng10 小时前
后端零改动,给若依换一套现代化前端
vue.js·开源·node.js