最新资讯

  • 【Linux笔记】网络部分——基于Socket套接字实现最简单的HTTP协议服务器

【Linux笔记】网络部分——基于Socket套接字实现最简单的HTTP协议服务器

2026-02-01 04:52:30 栏目:最新资讯 5 阅读

38.基于Socket套接字实现最简单的HTTP协议服务器

文章目录

  • 38.基于Socket套接字实现最简单的HTTP协议服务器
      • 项目整体框架
        • 文件依赖图
        • 请求流程图
        • 类关系图
      • Socket套接字的封装
        • Socket父类
        • TcpSocket子类中的各种方法
      • Http协议结构实现(HttpProtocol.hpp)
        • 全局字段
        • HTTP请求结构
        • HTTP响应结构
      • TCP服务器封装
      • HTTP服务器核心
        • 全局字段
        • class HttpServer
      • 主程序入口—Httpserver.cc
      • 运行结果
        • 服务器日志打印
        • 浏览器客户端

项目整体框架

这个项目是一个基于C++的HTTP服务器,使用了多线程和线程池来处理并发请求。下面我将梳理整个项目的框架结构:

  1. 日志系统 (Log.hpp)
    • 提供了日志记录功能,支持控制台和文件两种输出方式。
    • 定义了日志级别(DEBUG, INFO, WARNING, ERROR, FATAL)和日志策略(ConsoleLogStrategy, FileLogStrategy)。
    • 通过宏LOG(Level)来记录日志,使用方便。
  2. 线程模块 (Thread.hpp)
    • 封装了线程类,可以创建线程并执行指定的函数。
    • 提供了线程的启动、连接、分离、停止等方法。
  3. 线程池 (ThreadPool.hpp)
    • 使用单例模式管理线程池,可以指定线程数量。
    • 将任务(函数对象)加入队列,由线程池中的线程执行。
    • 使用了互斥锁和条件变量来同步任务队列。
  4. 网络地址类 (InetAddr.hpp)
    • 封装了网络地址,包括IP和端口,提供了网络字节序和主机字节序的转换。
  5. Socket类 (Socket.hpp)
    • 封装了TCP Socket,提供了创建socket、绑定、监听、接受连接、发送和接收数据等方法。
    • 使用智能指针管理Socket对象。
  6. TCP服务器 (TcpServer.hpp)
    • 基于Socket类,封装了TCP服务器。
    • 使用线程池来处理每个客户端连接,每个连接由一个独立的线程处理。
  7. HTTP协议解析 (HttpProtocol.hpp)
    • 定义了HttpRequest和HttpResponse类,用于解析HTTP请求和构建HTTP响应。
    • HttpRequest:解析请求行、请求头、请求体。
    • HttpResponse:设置状态码、头部字段、响应体,并序列化为字符串。
  8. HTTP服务器 (HttpServer.hpp)
    • 基于TcpServer,实现了HTTP服务器。
    • 可以注册路由处理函数(如Login、Register等)。
    • 对于带参数的请求(GET带查询字符串或POST带正文),调用相应的路由处理函数;否则,直接返回请求的静态文件。
  9. 条件变量 (Cond.hpp)
    • 封装了条件变量,用于线程同步。
  10. 互斥锁 (Mutex.hpp)
    • 封装了互斥锁和锁守卫,用于资源互斥访问。
  11. 公共头文件 (Common.hpp)
    • 定义了一些宏和错误码。
  12. 主程序 (Httpserver.cc)
    • 创建HttpServer对象,注册路由,启动服务器。

项目的工作流程:

  1. 主函数中创建HttpServer对象,并注册路由处理函数(如Login、Register等)。
  2. 启动HTTP服务器,开始监听指定端口。
  3. 当有客户端连接时,TcpServer接受连接,并将处理任务(HanderRequest)提交给线程池。
  4. 在HanderRequest中,读取HTTP请求,解析请求。
  5. 如果请求的路径是注册的路由,则调用相应的处理函数;否则,尝试返回静态文件。
  6. 处理函数生成响应,发送给客户端。

项目实现之后,我们可以使用任意浏览器访问我们的服务器,读取网页内容以及操作。

文件依赖图
graph TB
    %% 主程序入口
    A[Httpserver.cc
主程序入口] --> B[HttpServer.hpp
HTTP服务器核心] %% HTTP服务器层 B --> C[HttpProtocol.hpp
HTTP协议解析] B --> D[TcpServer.hpp
TCP服务器封装] %% 网络层 D --> E[Socket.hpp
Socket抽象层] E --> F[InetAddr.hpp
地址管理] E --> G[Log.hpp
日志系统] %% 并发层 D --> H[ThreadPool.hpp
线程池管理] H --> I[Thread.hpp
线程封装] H --> J[Mutex.hpp
互斥锁] H --> K[Cond.hpp
条件变量] %% 工具层 E --> L[Common.hpp
公共定义] G --> J K --> J %% 样式定义 classDef main fill:#e1f5fe classDef http fill:#f3e5f5 classDef network fill:#e8f5e8 classDef concurrency fill:#fff3e0 classDef utility fill:#fce4ec class A main class B,C http class D,E,F network class H,I,J,K concurrency class G,L utility
请求流程图
flowchart TD
    %% 请求处理流程
    Start[客户端请求] --> Accept[TcpServer::Accepter
接受连接] Accept --> CreateSocket[创建客户端Socket
Socket.hpp] CreateSocket --> Enqueue[任务入队
ThreadPool.hpp] Enqueue --> WorkerThread[工作线程处理] subgraph WorkerThread [工作线程处理流程] direction WT1[获取任务] --> WT2[HttpServer::HanderRequest
请求处理] WT2 --> WT3[HttpRequest::Deserialize
协议解析] WT3 --> WT4{路由判断} WT4 -->|静态请求| WT5[ReqBuildResp
静态文件服务] WT4 -->|动态请求| WT6[路由方法调用
如Login/Register] WT5 --> WT7[HttpResponse::Serialize
响应构建] WT6 --> WT7 WT7 --> WT8[Socket::Send
发送响应] end WT8 --> End[请求完成] %% 日志记录点 Accept -.->|记录连接日志| Log1[Log.hpp] WT2 -.->|记录处理日志| Log1 WT3 -.->|记录解析日志| Log1 WT7 -.->|记录响应日志| Log1
类关系图
classDiagram
    %% HTTP服务器核心类
    class HttpServer {
        -unique_ptr~TcpServer~ _tcpserver
        -unordered_map~string, route_hander_t~ _route
        +Start()
        +SetRouteMethod()
        +GetContent()$
        -HanderRequest()
        -ReqBuildResp()$
    }
    
    class TcpServer {
        -unique_ptr~Socket~ _socket
        -int _port
        -hander_t _hander
        +InitServer()
        +Loop()
        -HanderRequest()
    }
    
    class Socket {
        <>
        +SocketOrDie()* bool
        +BindOrDie()* bool
        +ListenOrDie()* bool
        +Accepter()* SockPtr
        +Recv()* ssize_t
        +Send()* ssize_t
        +GetSockfd()* int
    }
    
    class TcpSocket {
        -int _sockfd
        -int _listensockfd
        +SocketOrDie() bool
        +BindOrDie() bool
        +ListenOrDie() bool
        +Accepter() SockPtr
        +Recv() ssize_t
        +Send() ssize_t
    }
    
    %% HTTP协议类
    class HttpRequest {
        -string _method, _uri, _path, _args
        -unordered_map~string, string~ _heardkv
        +Deserialize()
        +GetPath()
        +GetArgs()
        +GetIsexec()
    }
    
    class HttpResponse {
        -string _ver, _status_code, _body
        -unordered_map~string, string~ _heardkv
        +Serialize()
        +SetStatusCode()
        +SetBody()
        +SetHeardKV()
    }
    
    %% 并发相关类
    class ThreadPool~T~ {
        -vector~thread_t~ _threads
        -queue~T~ _ptasks
        -Mutex _lock
        -Cond _cond
        +getinstance()$ ThreadPool~T~*
        +Equeue()
        +Start()
        +Stop()
        -HanderTask()
    }
    
    class Thread {
        -string _name
        -pthread_t _tid
        -func_t _func
        +Start()
        +Jion()
        +Stop()
    }
    
    class Logger {
        -shared_ptr~LogStrategy~ _strategy
        +operator()() LogMessage
        +EnableConsoleLog()
        +EnableFileLog()
    }
    
    %% 关系定义
    HttpServer --> TcpServer
    TcpServer --> Socket
    Socket <|-- TcpSocket
    HttpServer --> HttpRequest
    HttpServer --> HttpResponse
    TcpServer --> ThreadPool
    ThreadPool --> Thread
    ThreadPool --> Logger

注:在之前的博客中,我们详细讲解了其他基础功能的封装,这里不做额外解释

Socket套接字的封装

在学习Linux的过程中,我们逐步实现和封装了各种系统和网络接口。比如互斥锁Mutex,条件变量Cond,日志Log,线程Thread,线程池ThreadPool,以及IP和端口号的主机序列与网络序列的转换类InetAddr。在前面用套接字实现Tcp服务器时我们直接使用Socket套接字的系统调用,现在,我们对Socket套接字也进行封装。

Socket父类
class Socket
{
public:
    virtual ~Socket() = default;
    virtual bool SocketOrDie() = 0;
    virtual bool BindOrDie(int port) = 0;
    virtual bool ListenOrDie() = 0;
    virtual SockPtr Accepter(InetAddr *cliaddr) = 0;
    virtual ssize_t Recv(std::string &out) = 0;
    virtual ssize_t Send(const std::string &in) = 0;
    virtual int GetSockfd() = 0;
    virtual void Close() = 0;

    void BuildTcpSocket(int port)
    {
        if(!SocketOrDie()) return; 
        if(!BindOrDie(port)) return;
        if(!ListenOrDie()) return;
    }

private:
};
  • 封装不只是简单封装成类,而是要实现高扩展性。套接字有UDP和TCP之分,也有LinuxWindows版本差异。虽然TCP和UDP套接字系统调用接口基本相同,但Windows需要加载win32对应的socket库和自定义类型。当前不封装Windows接口,但保留未来扩展可能。采用模板方法模式,因为创建套接字过程具有明显套路性。

  • 创建Socket基类,规定所有创建套接字的方法,包括创建、绑定、监听、接受连接和关闭等操作。基类提供固定模式的套接字创建方法,具体实现由子类完成。在基类中定义一系列虚方法,之后再具体实现Linux系统下的TCP套接字继承父类Socket。

TcpSocket子类中的各种方法
  • 框架、构造析构函数

    //Socket.hpp
    
    #define RECV_BUFFER_SIZE 1024
    #define SEND_BUFFER_SIZE 1024
    
    using namespace My_Log;
    
    namespace My_Socket
    {
        class Socket; // 声明
        using SockPtr = std::shared_ptr<Socket>;
    
        
    
        class TcpSocket : public Socket
        {
        public:
            // 支持传参构造,用于Accepter返回含有指定客户端的文件描述符(_sockfd)的智能指针
            TcpSocket(int sockfd = -1)
                : _sockfd(sockfd), _listensockfd(-1)
            {
            }
            //.......其他功能函数
    
            int GetSockfd() override { return _sockfd; }
            ~TcpSocket() {}
    
        private:
            int _sockfd;       // accept返回的套接字用于recv和send
            int _listensockfd; // 监听套接字
        };
    }
    

    在前面用套接字实现Tcp服务器时我们知道,socket()创建的套接字不直接提供发送和接收数据的服务,这里定义了两个套接字。

  • 创建套接字

    bool SocketOrDie() override
    {
        _listensockfd = ::socket(AF_INET, SOCK_STREAM, 0);
        if (_listensockfd < 0)
        {
            LOG(LogLevel::ERROR) << "socket fail!";
            return false;
        }
        LOG(LogLevel::INFO) << "socket success, listensockfd: " << _listensockfd;
        return true;
    }
    
  • 绑定套接字

    bool BindOrDie(int port) override
    {
        InetAddr addr(port);
        int n = ::bind(_listensockfd, addr.GetSockaddr(), addr.GetSockaddrLen());
        if (n < 0)
        {
            LOG(LogLevel::ERROR) << "bind fail!";
            return false;
        }
        LOG(LogLevel::INFO) << "bind success!";
        return true;
    }
    
  • 监听套接字

    bool ListenOrDie() override
    {
        int n = ::listen(_listensockfd, 8);
        if (n < 0)
        {
            LOG(LogLevel::ERROR) << "listen fail!";
            return false;
        }
        LOG(LogLevel::INFO) << "listen success!";
        return true;
    }
    

前面三个函数是创建套接字的固定流程,因此可以在基类中直接定义一个函数BuildTcpSocket依次执行三个函数的方法.

  • 创建连接——连接客户端

    SockPtr Accepter(InetAddr *cliaddr) override
    {
        if (cliaddr == nullptr)
        {
            return nullptr;
        }
    
        // 建立连接
        struct sockaddr_in cliaddr_in;
        socklen_t cliaddrlen;
        _sockfd = ::accept(_listensockfd, CONV(&cliaddr_in), &cliaddrlen);
        if (_sockfd < 0)
        {
            LOG(LogLevel::WARNING) << "accept fail!";
            return nullptr;
        }
        LOG(LogLevel::WARNING) << "accept success!, sockfd: " << _sockfd;
    
        // 返回参数
        cliaddr->SetAddr(cliaddr_in, cliaddrlen);
    
        return std::make_shared<TcpSocket>(_sockfd);
    }
    

Accepter函数中,它返回一个SockPtr(即std::shared_ptr),这样我们就可以将每个接受的客户端连接封装成一个独立的Socket对象,并通过智能指针管理其生命周期。为什么要这么做后面会有解释。

  • 接受数据

    ssize_t Recv(std::string &out)
    {
        char recbuff[RECV_BUFFER_SIZE] = {0};
        int n = ::recv(_sockfd, &recbuff, RECV_BUFFER_SIZE - 1, 0);
        if (n < 0)
        {
            out = std::string();
            return n;
        }
        recbuff[n] = 0;
        out = recbuff;
        return n;
    }
    
  • 发送数据

    ssize_t Send(const std::string &in)
    {
        return ::send(_sockfd, in.c_str(), in.size(), 0);
    }
    
  • 关闭套接字

    void Close() override
    {
        if (_sockfd == -1)
            return;
        ::close(_sockfd);
    }
    

Http协议结构实现(HttpProtocol.hpp)

全局字段
#pragma once

#include 
#include 
#include 
#include 
#include 

#include "Log.hpp"

using namespace My_Log;

const std::string sepline = "
";
const std::string sepheard = ": ";
const std::string sepblank = " ";
const std::string defver = "HTTP/1.0";
  • 包含需要的头文件
  • 根据HTTP协议结构化数据定义标识符,比如每一行结尾的换行符sepline,请求包头中KV值之间的分隔符sepheard,以及请求行、状态行不同内容分开的空格sepblank
  • 定义一些不会经常修改的字段,比如响应字段中的HTTP协议
HTTP请求结构
  • 框架、构造析构函数

    class HttpRequest
    {
    public:
        HttpRequest()
        {
        }
    
        void LOGPrint()
        {
            LOG(LogLevel::DEBUG) << "method: " << _method;
            LOG(LogLevel::DEBUG) << "uri: " << _uri;
            LOG(LogLevel::DEBUG) << "path: " << _path;
            LOG(LogLevel::DEBUG) << "args: " << _args;
            LOG(LogLevel::DEBUG) << "ver: " << _ver;
    
            for (auto &h : _heardkv)
            {
                LOG(LogLevel::DEBUG) << h.first << "-----" << h.second;
            }
            LOG(LogLevel::DEBUG) << "empline: " << _empline;
            LOG(LogLevel::DEBUG) << "body: " << _body;
        }
        std::string GetMethod() const { return _method; }
        std::string GetUri() const { return _uri; }
        std::string GetPath() const { return _path; }
        std::string GetArgs() const { return _args; }
        std::string GetVer() const { return _ver; }
        std::string GetBody() const { return _body; }
        bool GetIsexec() const { return _isexec; }
    
        ~HttpRequest()
        {
        }
    
    private:
        // 客户端发来的http请求解析后的数据
        std::string _method;										// 请求方法
        std::string _uri;											// URL
        std::string _path;											// URL_路径(URL中可能不只有路径)
        std::string _args;											// URL_参数(URL中可能带有参数)
        std::string _ver;											// 版本
        std::unordered_map<std::string, std::string> _heardkv;		// 请求报头的KV值,用unordered_map储存,方便查找
        std::string _empline;										// 空行(为了完整性,也定义一个)
        std::string _body;											// 请求正文
    
        bool _isexec; 												// 判断这个请求是否带参
    };
    
    • 根据HTTP协议的数据格式,在结构体中定义一系列的私有成员变量,并给出读取他们的方法
    • 为了方便从日志中寻找错误,我们用一个函数将反序列化之后的成员变量的值打印出来
  • 反序列化

    void Deserialize(std::string &req)
    {
        // 解析状态行
        int pos = req.find(sepline);
        if (pos == std::string::npos)
        {
            LOG(LogLevel::WARNING) << "find err!";
            return;
        }
        std::string firstline = req.substr(0, pos);
        std::stringstream ss(firstline);
        req.erase(0, pos + sepline.size());
        ss >> _method >> _uri >> _ver;
        LOG(LogLevel::DEBUG) << "  #  " << _method << "  #  " << _uri << "  #  " << _ver;
    
        // 解析报头
        while (true)
        {
            // 解析报头中的一行
            int p1 = req.find(sepline);
            if (p1 == std::string::npos)
            {
                LOG(LogLevel::WARNING) << "find err";
                return;
            }
            std::string line = req.substr(0, p1);
            req.erase(0, p1 + sepline.size());
            // 遇到空行跳出循环
            if (line.empty())
                break;
    
            // 一行中的kv值
            int p2 = line.find(sepheard);
            if (p2 == std::string::npos)
            {
                LOG(LogLevel::WARNING) << "find err";
                return;
            }
            std::string key = line.substr(0, p2);
            line.erase(0, p2 + sepheard.size());
            _heardkv.insert(std::pair<std::string, std::string>(key, line));
        }
    
        // 空行
        _empline = sepline;
    
        // 正文
        _body = req;
    
        // 判断是否带参
        if (_method == "GET")
        {
            pos = _uri.find("?");
            if (pos == std::string::npos)
            {
                _path = _uri;
                _args = "";
                _isexec = false;
            }
            else
            {
                _path = _uri.substr(0, pos);
                _args = _uri.substr(pos + 1);
                _isexec = true;
            }
        }
        else if (_method == "POST")
        {
            _path = _uri;
            if (_body.empty())
            {
                _isexec = false;
            }
            else
            {
                _args = _body;
                _isexec = true;
            }
        }
    }
    
    • 其实就是对客户端发来的一串字符串按照HTTP数据结构分析,把相应值储存在结构体的成员变量中——就是字符串操作,不做过多解释
    • 由于HTTP协议基于TCP协议。因此数据是以字节流的形式传输的,我们这里没有做差错处理,如有需要后面可以补上
HTTP响应结构
  • 框架、构造析构函数

    class HttpResponse
    {
    private:
        std::string StatusCTOS(const int &code) const
        {
            if (code == 200)
                return "OK";
            else if (code == 404)
                return "Not Found";
            else
                return std::string();
        }
    
    public:
        HttpResponse() : _empline(sepline), _ver(defver)
        {
        }
        void LOGPrint()
        {
            LOG(LogLevel::DEBUG) << "ver: " << _ver;
            LOG(LogLevel::DEBUG) << "status_code: " << _status_code;
            LOG(LogLevel::DEBUG) << "status_str: " << _status_str;
    
            for (auto &h : _heardkv)
            {
                LOG(LogLevel::DEBUG) << h.first << "-----" << h.second;
            }
    
            LOG(LogLevel::DEBUG) << "empline: " << _empline;
            LOG(LogLevel::DEBUG) << "body: " << _body;
        }
    
        std::string GetVer() const { return _ver; }
        std::string GetStatusCode() const { return _status_code; }
        std::string GetStatusStr(const int &code) const { return StatusCTOS(code); }
        std::string GetHeardKV(const std::string &k) { return _heardkv[k]; }
        std::string GetBody() const { return _body; }
    
        void SetVer(const std::string &ver) { _ver = ver; }
        void SetStatusCode(const int &code)
        {
            _status_code = std::to_string(code);
            _status_str = StatusCTOS(code);
        }
        void SetHeardKV(const std::string &k, const std::string &v)
        {
            _heardkv.insert(std::pair<std::string, std::string>(k, v));
        }
        void SetBody(const std::string &body) { _body = body; }
    
        ~HttpResponse()
        {
        }
    
    private:
        std::string _ver;
        std::string _status_code;
        std::string _status_str;
        std::unordered_map<std::string, std::string> _heardkv;
        std::string _empline;
        std::string _body;
    };
    
    • 根据HTTP协议的数据格式,在结构体中定义一系列的私有成员变量,并给出读取和修改他们的方法
  • 序列化

    void Serialize(std::string &resp)
    {
        // 序列化状态行
        resp = _ver + sepblank + _status_code + sepblank + _status_str + sepline;
        // 序列化报头
        for (auto &h : _heardkv)
        {
            resp += h.first + sepheard + h.second + sepline;
        }
        // 序列化空行
        resp += _empline;
        // 序列化正文
        resp += _body;
    }
    

TCP服务器封装

#pragma once

#include 
#include 
#include 
#include 

#include "Socket.hpp"
#include "ThreadPool.hpp"
#include "Log.hpp"

using namespace My_Log;
using namespace My_Socket;
using namespace My_ThreadPool;

using hander_t = std::function<void(SockPtr, InetAddr)>;
using threadpool_t = std::function<void()>;

class TcpServer
{
public:
    TcpServer(int port) : _port(port), _socket(std::make_unique<TcpSocket>())
    {
    }
    void InitServer(hander_t hander)
    {
        _hander = hander;
        _socket->BuildTcpSocket(_port);
    }
    void Loop()
    {
        LOG(LogLevel::DEBUG) << "running Loop";
        _isrunning = true;
        std::string recvstr;
        while (true)
        {
            InetAddr cliaddr;
            SockPtr sp = _socket->Accepter(&cliaddr);
            if (!sp)
            {
                break;
            }
            LOG(LogLevel::DEBUG) << "get a new client, info is: " << cliaddr.GetStrIpPort();
            ThreadPool<threadpool_t>::getinstance()->Equeue([this, cliaddr, sp]()
                                                            { this->_hander(sp, cliaddr); });
        }
    }
    hander_t GetHander() { return _hander; }
    ~TcpServer()
    {
        _socket->Close();
    }

private:
    std::unique_ptr<Socket> _socket;
    int _port;
    bool _isrunning;
    hander_t _hander;
};
  • hander_t:我们使用包装器将TCP连接管理与业务逻辑解耦,允许不同的上层应用(如HTTP、FTP)复用相同的TCP服务器框架

  • 使用 unique_ptr 自动管理Socket生命周期,避免资源泄漏,确保异常安全,遵循RAII(Resource Acquisition Is Initialization)原则

  • 这里说明一点:我们实现tcpserver时我们会在对应结构体中创建一个TcpSocket套接字的私有成员变量,这个变量用于最开始的套接字的创建、绑定、监听工作,这种工作在一个服务器中只用执行一次,所以我们会把这个类内的成员变量用unique_ptr管理,不允许拷贝。之后在class TcpServerLoop函数(循环逻辑)中,我们会将每个链接到的客户端的发送和接收任务注册给线程池,由线程池来执行每一个客户端的数据收发任务,这样主线程就可以只关注于服务器与客户端的连接工作(Accepter),数据收发可以由子线程多线程执行。但是要想子线程执行数据收发任务就需要拿到对应客户端的套接字以及RecvSend方法。而我们在封装套接字的时候我们直接把套接字与RecvSend方法封装在了一起,因此,我们可以让Accepter函数返回一个与客户端套接字有关的Socket对象,之后Loop函数把这个对象传递给子线程。就可以让子线程代替主线程执行数据收发的任务了。

HTTP服务器核心

全局字段
#pragma once

#include 
#include 
#include 
#include 

#include "Socket.hpp"
#include "TcpServer.hpp"
#include "InetAddr.hpp"
#include "HttpProtocol.hpp"

using namespace My_Socket;

using task_t = std::function<void()>;
using route_hander_t = std::function<void(HttpRequest &, HttpResponse &)>;

const std::string defhomepage = "wwwlsh";
const std::string firstpage = "index.html";
const std::string page404 = "/404.html";
  • 定义了一个类型别名 route_handler_t,用于表示处理HTTP请求和响应的函数
class HttpServer
  • 基本框架
class HttpServer
{
private:
    static std::string Suffix2Desc(const std::string &suffix);
    // 请求直接构建应答
    static bool ReqBuildResp(HttpRequest &req, HttpResponse &resp);
    void HanderRequest(SockPtr &sockptr, InetAddr &cliaddr);

public:
    HttpServer(int port) : _tcpserver(std::make_unique<TcpServer>(port))
    {
    }
    void Start();
    static std::string GetContent(const std::string &path);
    void SetRouteMethod(const std::string &funcname, route_hander_t func);
    ~HttpServer()
    {
    }

private:
    std::unique_ptr<TcpServer> _tcpserver;
    std::unordered_map<std::string, route_hander_t> _route; // 其他方法路由
};
  • 这个结构体包含指向Tcp服务器的智能指针。通过TcpServer处理TCP连接,然后将HTTP协议的处理交给自己的成员函数。HTTP → TCP → Socket

  • HttpServer使用一个哈希表来存储路由处理函数,键为路径(如"/login"),值为处理该路径的函数。

  • Suffix2Desc函数

    static std::string Suffix2Desc(const std::string &suffix)
    {
        if (suffix == ".html")
            return "text/html";
        else if (suffix == ".jpg")
            return "application/x-jpg";
        else
            return "text/html";
    }
    
    • 内部私有成员函数,通过判断文件的后缀名返回对应的文件类型,用于构建HTTP响应结构中的Content-Type
  • ReqBuildResp函数

    static bool ReqBuildResp(HttpRequest &req, HttpResponse &resp)
    {
        std::string path = defhomepage + req.GetPath();
        if (path.back() == '/')
        {
            path += firstpage; // wwwlsh/index.html
        }
    
        LOG(LogLevel::DEBUG) << "------客户端在请求: " << req.GetUri();
        req.LOGPrint();
        LOG(LogLevel::DEBUG) << "-----------------------------------" << req.GetUri();
    
        std::string content = GetContent(path);
        if (content.empty())
        {
            resp.SetStatusCode(404);
            content = GetContent(page404);
        }
        else
        {
            resp.SetStatusCode(200);
        }
        resp.SetHeardKV("Content-Length", std::to_string(content.size()));
        auto pos = req.GetUri().rfind(".");
    
        std::string mime_type;
        if (pos == std::string::npos)
            mime_type = std::string(".html");
        else
            mime_type = req.GetUri().substr(pos);
        resp.SetHeardKV("Content-Type", Suffix2Desc(mime_type));
    
        resp.SetBody(content);
    
        return true;
    }
    
    • 如果URL不带参数,直接读取指定路劲下的文件
  • HanderRequest函数

    void HanderRequest(SockPtr &sockptr, InetAddr &cliaddr)
    {
        std::string recvstr;
        while (true)
        {
            int n = sockptr->Recv(recvstr);
            if (n < 0)
            {
                LOG(LogLevel::WARNING) << "Recv fail!";
                continue;
            }
            else if (n == 0)
            {
                LOG(LogLevel::INFO) << "client close, client# " << cliaddr.GetStrIpPort();
                break;
            }
    
            LOG(LogLevel::INFO) << "recvbuf is : " << recvstr;
    
            HttpRequest req;
            HttpResponse resp;
            req.Deserialize(recvstr);
    
            if (req.GetIsexec())
            {
                // 带参,执行对应方法
                LOG(LogLevel::DEBUG) << "running there!";
                _route[req.GetPath()](req, resp);
            }
            else
            {
                // 不带参,请求直接构建应答
                ReqBuildResp(req, resp);
            }
            std::string resp_str;
            resp.Serialize(resp_str);
    
            LOG(LogLevel::INFO) << "result is : " << resp_str;
            sockptr->Send(resp_str);
        }
    }
    

    是实际处理HTTP请求的函数。它被设置为TcpServer的回调函数,当有新的客户端连接时,TcpServer会创建一个线程来执行这个函数。

  • Start函数

    void Start()
    {
        _tcpserver->InitServer([this](SockPtr sockptr, InetAddr addr)
                               { this->HanderRequest(sockptr, addr); });
        _tcpserver->Loop();
    }
    

    启动HTTP服务器。它通过Lambda表达式向TcpServer注册处理函数,然后启动TcpServer的事件循环。

  • GetContent函数

    static std::string GetContent(const std::string &path)
    {
        std::string content;
        std::ifstream in(path, std::ios::binary);
        if (!in.is_open())
            return std::string();
        in.seekg(0, in.end);
        int filesize = in.tellg();
        in.seekg(0, in.beg);
    
        content.resize(filesize);
        in.read((char *)content.c_str(), filesize);
        in.close();
        LOG(LogLevel::DEBUG) << "content length: " << content.size();
        return content;
    }
    

    从指定路径的文件中获取文件内容

  • SetRouteMethod函数

    void SetRouteMethod(const std::string &funcname, route_hander_t func)
    {
        _route[funcname] = func;
        LOG(LogLevel::INFO) << "register route method success! name: " << funcname;
    }
    

    注册路由处理函数

主程序入口—Httpserver.cc

HttpServer.cc 作为整个HTTP服务器的启动入口和业务配置中心,通过依赖注入和路由注册机制将底层网络框架与上层业务逻辑解耦,实现了服务器配置、路由映射和业务处理的无缝衔接,使得开发者只需关注具体业务逻辑的实现而无需关心底层网络通信细节。

#include 
#include 
#include 

#include "HttpServer.hpp"

// 其他方法
void Login(HttpRequest &req, HttpResponse &resp)
{
    // req.Path(): /login
    // 根据req,动态构建username=lisi&password=abcdefg
    LOG(LogLevel::DEBUG) << "进入登录模块" << req.GetPath() << ", " << req.GetArgs();
    std::string req_args = req.GetArgs();
    // 1. 解析参数格式,得到要的参数

    // 2. 访问数据库,验证对应的用户是否是合法的用户,其他工作....
    // TODO
    // SessionManager m;
    // session_id = m.CreateSession(XXXXX);

    // 3. 登录成功
    std::string body = HttpServer::GetContent("wwwlsh/user.html");
    resp.SetStatusCode(200);
    resp.SetHeardKV("Content-Length", std::to_string(body.size()));
    resp.SetHeardKV("Content-Type", "text/html");
    resp.SetBody(body);

    // resp.SetStatusCode(302);
    // resp.SetHeardKV("Location", "/user.html");
}
void Register(HttpRequest &req, HttpResponse &resp)
{
    // 根据req,动态构建resp
    LOG(LogLevel::DEBUG) << "进入注册模块" << req.GetPath() << ", " << req.GetArgs();
}

void Search(HttpRequest &req, HttpResponse &resp)
{
    // 根据req,动态构建resp
    LOG(LogLevel::DEBUG) << "进入搜索模块" << req.GetPath() << ", " << req.GetArgs();
}

void Test(HttpRequest &req, HttpResponse &resp)
{
    // 根据req,动态构建resp
    LOG(LogLevel::DEBUG) << "进入测试模块" << req.GetPath() << ", " << req.GetArgs();
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage: " << argv[0] << "  " << std::endl;
        return 1;
    }
    int port = std::stoi(argv[1]);

    std::unique_ptr<HttpServer> httpser_ptr = std::make_unique<HttpServer>(port);

    // 注册其他请求处理方法
    httpser_ptr->SetRouteMethod("/login", Login);
    httpser_ptr->SetRouteMethod("/register", Register);
    httpser_ptr->SetRouteMethod("/search", Search);
    httpser_ptr->SetRouteMethod("/test", Test);

    // 运行
    httpser_ptr->Start();

    return 0;
}

运行结果

我们可以在目标文件夹下定义几个html文件用来测试,由于我们主要学习HTTP服务器的搭建,对于简单的网页可以由AI代劳:

服务器日志打印

浏览器客户端

本文地址:https://www.yitenyun.com/4440.html

搜索文章

Tags

#语言模型 #服务器 #人工智能 #大模型 #ai #ai大模型 #agent #飞书 #python #pip #conda #微信 #log4j #ollama #AI #AI编程 #私有化部署 #运维 #飞牛nas #fnos #学习 #产品经理 #AI大模型 #大模型学习 #大模型教程 #kylin #docker #arm #ios面试 #ios弱网 #断点续传 #ios开发 #objective-c #ios #ios缓存 #远程工作 #Trae #IDE #AI 原生集成开发环境 #Trae AI #ssh #linux #云计算 #云原生 #mongodb #数据库 #算法 #数据结构 #PyTorch #深度学习 #模型训练 #星图GPU #github #信息与通信 #自然语言处理 #rpa #实时互动 #ARM服务器 # GLM-4.6V # 多模态推理 香港站群服务器 多IP服务器 香港站群 站群服务器 #kubernetes #笔记 #平面 #容器 #学习方法 #fastapi #html #css #银河麒麟高级服务器操作系统安装 #银河麒麟高级服务器V11配置 #设置基础软件仓库时出错 #银河麒高级服务器系统的实操教程 #生产级部署银河麒麟服务系统教程 #Linux系统的快速上手教程 #分布式 #架构 #配置中心 #SpringCloud #Apollo #大数据 #职场和发展 #程序员创富 #vscode #ubuntu #gitee #自动化 #ansible #mysql #分库分表 #垂直分库 #水平分表 #雪花算法 #分布式ID #跨库查询 #科技 #神经网络 #华为云 #部署上线 #动静分离 #Nginx #新人首发 #llama #opencv #音视频 #ide #java #开发语言 #前端 #javascript #AIGC #开源 #pytorch #YOLO #spring boot #maven #spring #数学建模 #大模型入门 #低代码 #爬虫 #hadoop #hbase #hive #zookeeper #spark #kafka #flink #C++ #Reactor #CFD #langchain #gemini #gemini国内访问 #gemini api #gemini中转搭建 #Cloudflare #阿里云 #网络 #区块链 #测试用例 #生活 #node.js #http #mcp #mcp server #AI实战 #流程图 #论文阅读 #信息可视化 #大语言模型 #长文本处理 #GLM-4 #Triton推理 #web安全 #安全 #php #网络安全 #就业指南 #tcp/ip #pycharm #MobaXterm #notepad++ #物联网 #websocket #sql #agi #nginx #机器学习 #企业微信 #AI办公 #智能助手 #进程控制 #java-ee #fabric #postgresql #openHiTLS #TLCP #DTLCP #密码学 #商用密码算法 #项目 #高并发 #Telegram机器人 #ClawdBot #多模态翻译 #大模型推理 #FRP #rag #aws #SSM 框架 #孕期健康 #产品服务推荐 #推荐系统 #用户交互 #经验分享 #安卓 #windows #flutter #鸿蒙 #多个客户端访问 #IO多路复用 #回显服务器 #TCP相关API #重构 #计算机视觉 #word #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #Ansible # 自动化部署 # VibeThinker #Linux #TCP #c++ #线程 #线程池 #golang #数据结构与算法 #iventoy #VmWare #OpenEuler #矩阵 #线性代数 #AI运算 #向量 #分阶段策略 #模型协议 #Agent #程序员 #驱动开发 #harmonyos #华为 #git #RAGFlow #DeepSeek-R1 #RTP over RTSP #RTP over TCP #RTSP服务器 #RTP #TCP发送RTP #风控模型 #决策盲区 #springboot #后端 #腾讯云 #能源 #RAG #RAG调优 #RAG系统 #召回 #鸿蒙PC #android #c# #开源软件 #https #网络协议 #mvp #个人开发 #设计模式 #unity #游戏引擎 #性能优化 #vue上传解决方案 #vue断点续传 #vue分片上传下载 #vue分块上传下载 #HCIA-Datacom #H12-811 #题库 #最新题库 #正则 #正则表达式 #qt #cpolar #dify #Conda # 私有索引 # 包管理 #FaceFusion # Token调度 # 显存优化 #数信院生信服务器 #Rstudio #生信入门 #生信云服务器 #课程设计 #le audio #蓝牙 #低功耗音频 #通信 #连接 #centos #stm32 #servlet #测试工具 #microsoft #iBMC #UltraISO #Harbor #Windows 更新 #bytebase #进程 #缓存 #redis #pjsip #ci/cd #jenkins #gitlab #堡垒机 #安恒明御堡垒机 #windterm #serverless #硬件工程 #rocketmq #内存治理 #django #jvm #学习笔记 #jdk #MCP #MCP服务器 #搜索引擎 #导航网 #FL Studio #FLStudio #FL Studio2025 #FL Studio2026 #FL Studio25 #FL Studio26 #水果软件 #微服务 #Oauth2 #电脑 #mobaxterm #vue.js #超算服务器 #算力 #高性能计算 #仿真分析工作站 #jar #毕业设计 #程序人生 #科研 #博士 #企业开发 #ERP #项目实践 #.NET开发 #C#编程 #编程与数学 #文心一言 #AI智能体 #mcu #牛客周赛 #lvs #负载均衡 #ecmascript #elementui #jetty #scrapy #散列表 #哈希算法 #内网穿透 #jmeter #功能测试 #软件测试 #自动化测试 #知识图谱 #儿童书籍 #儿童诗歌 #童话故事 #经典好书 #儿童文学 #好书推荐 #经典文学作品 #svn #c语言 #ai agent #ai大小模型 #小模型 #开源小模型 #8b模型 #国产大模型 #SOTA #spring cloud #json #论文 #毕设 #PyCharm # 远程调试 # YOLOFuse #华为od #华为od机考真题 #华为od机试真题 #华为OD上机考试真题 #华为OD机试双机位C卷 #华为OD上机考试双机位C卷 #华为ODFLASH坏块监测系统 #转行 #时序数据库 #Canal #ESXi #udp #ssl #DeepSeek #服务器繁忙 #vim #gcc #yum #uni-app #小程序 #设备驱动 #芯片资料 #网卡 #ddos #visual studio #ui #团队开发 #墨刀 #figma #vllm #推荐算法 #swiftui #swift #gitea #ESP32 #开发环境搭建 #游戏 #dubbo #FTP服务器 #单片机 #嵌入式硬件 #电脑故障 #文件系统 #2026年美赛C题代码 #2026年美赛 #select #链表 #处理器模块 #现货库存 #价格优惠 #PM864AK01 #3BSE018161R1 #PLC #控制器模块 #shell #CPU利用率 #边缘计算 #matlab #支持向量机 #服务器架构 #AI推理芯片 #蓝桥杯 #es安装 #prometheus #压枪 #autosar #SSH # ProxyJump # 跳板机 #开源社区 #国产基础软件 #操作系统 #AI框架 #Rust #线性回归 #嵌入式 #numpy #scikit-learn #matplotlib #FutureWarning #diskinfo # TensorFlow # 磁盘健康 #鸭科夫 #逃离鸭科夫 #鸭科夫联机 #鸭科夫异地联机 #开服 #分类 #汽车 #web #webdav #新浪微博 #前端框架 #lstm #CISSP #CISSP考点 #信息安全 #CISSP哪里考 #公众号:厦门微思网络 #+微信号:xmweisi #目标检测 #pyqt #单目测距 #速度估计 #pyqt界面 #注意力机制 #LLM #内容运营 #产品运营 #java大文件上传 #java大文件秒传 #java大文件上传下载 #java文件传输解决方案 #Redisson #Dell #PowerEdge620 #内存 #硬盘 #RAID5 #防排烟监控 #消防风机一体化 #BA楼宇自控 #DDC控制器 #IBMS集成系统 #系统架构 #PowerBI #企业 #LabVIEW #光谱仪 #串口通信 #AQ6370 #Ubuntu服务器 #硬盘扩容 #命令行操作 #VMware #职场发展 #创业创新 #深度优先 #DFS #css3 #计算机网络 #远程连接 #我的世界 #游戏私服 #云服务器 #全能视频处理软件 #视频裁剪工具 #视频合并工具 #视频压缩工具 #视频字幕提取 #视频处理工具 #架构师 #软考 #系统架构师 #社科数据 #数据分析 #数据挖掘 #数据统计 #经管数据 #Buck #NVIDIA #交错并联 #DGX #压力测试 #ffmpeg #高仿永硕E盘的个人网盘系统源码 #leetcode #chatgpt #DS随心转 #论文笔记 #钉钉 #机器人 #visual studio code #postman #easyui #flask #单元测试 #wpf #ProCAST2025 #ProCast #脱模 #顶出 #应力计算 #铸造仿真 #变形计算 #whisper #数列 #数学 #数论 #洛谷 #openclaw #实在Agent #同步WebServer服务器 #ESP32网页服务器 #轻量级http服务器 #ESP32物联网 #pdf #stl #chrome #ISP Pipeline #行缓冲 #游戏美术 #技术美术 #游戏策划 #游戏程序 #用户体验 #wsl #L2C #勒让德到切比雪夫 #laravel #xss #selenium #零售 #360AI图片精简版 #看图工具 #电脑看图工具 #360看图工具 #AI看图工具 #Android #Bluedroid #面试 #3d #国企混改 #国企混改咨询 #国企混改战略规划 #GPU #曦望 #macos #SSE #广播 #组播 #并发服务器 #transformer #企业架构治理 #电力企业IT架构 #IT架构设计 #AI写作 #思维模型 #认知框架 #认知 #无人机 #安全架构 #电商 #powerpoint #Com #数字营销 #seo #数据仓库 #微信小程序 #react.js #智慧校园一体化平台 #智慧校园管理系统 #合肥自友科技-智慧校园 #智慧校园源头厂家 #智慧校园软件供应商 #智慧校园平台服务商 #高性价比智慧校园系统 # Triton # 高并发 #DisM++ # 系统维护 #LangFlow #智能体 #math #homework #智能体从0到1 #新手入门 #dreamweaver #TRO #TRO侵权 #TRO和解 #bash #车辆排放 #健康医疗 #金融 #教育电商 #媒体 #prompt #openresty #lua #软件工程 #rpc #protobuf #三种参数 #参数的校验 #fastAPI #googlecloud #虚幻 #ue5 #SEO #防毒口罩 #防尘口罩 #具身智能 #发展心理学 #运动控制 #内在动机 #镜像神经元 #交叉学科 #七年级上册数学 #有理数 #有理数的加法法则 #绝对值 #excel #肿瘤相关巨噬细胞 #CXCL5 #信号通路 #胃癌 #mTOR #乐备实 #labex #arm开发 #wps #AI大模型应用开发 #语义检索 #文本向量化 #GTE-Pro #企业AI #AI运维 #Clawdbot #企业微信集成 #DevOps自动化 #全栈 #本地部署 #vLLM #IPMI #Modbus-TCP #android-studio #android studio #android runtime #阻塞队列 #生产者消费者模型 #服务器崩坏原因 #GNC #控制 #姿轨控 #多线程 #数组 #性能调优策略 #双锁实现细节 #动态分配节点内存 #oracle #gpu算力 #逻辑回归 #r-tree #测试覆盖率 #可用性测试 #GB/T4857 #GB/T4857.17 #GB/T4857测试 #cnn #信号处理 #目标跟踪 #OCR #文档识别 #DeepSeek-OCR-2 #信创适配 #labview #集成测试 #银河麒麟 #人大金仓 #Kingbase #AI产品经理 #大模型开发 #数字化转型 #实体经济 #中小企业 #商业模式 #软件开发 #青蓝送水模式 #创业干货 #企业级存储 #网络设备 #mmap #nio #Java面试 #Java程序员 #后端开发 #Redis #分布式锁 #爱心代码 #表白代码 #爱心 #tkinter #情人节表白代码 #测评 #海外服务器安装宝塔面板 #sglang #YOLO26 #YOLO11 #abtest #LangGraph #系统安全 #SQL #编辑器 #echarts #敏捷流程 #list #智能路由器 #自动驾驶 #漏洞 #数据安全 #注入漏洞 #Playbook #AI服务器 #语义搜索 #嵌入模型 #Qwen3 #AI推理 #材料工程 #数码相机 #智能电视 #windbg分析蓝屏教程 #pipeline #Transformers #NLP #vnstat #监控 #WT-2026-0001 #QVD-2026-4572 #smartermail #阳台种菜 #园艺手扎 #Gemini #Nano Banana Pro #sqlserver #酒店客房管理系统 #KMS 激活 #计算机现代史 #RAID #磁盘 #系统管理 #服务 #状态模式 #源代码管理 #ai编程 #结构体 #Moltbot #京东云 #蓝耘智算 #go #google #search #计算几何 #斜率 #方向归一化 #叉积 #扩展屏应用开发 #vue #asp.net #私域运营 #流量运营 #sqlmap #研发管理 #禅道 #禅道云端部署 #vue3 #天地图 #403 Forbidden #天地图403错误 #服务器403问题 #天地图API #部署报错 #考研 #.net #CCE #Dify-LLM #Flexus #设计规范 #js逆向 #逆向 #混淆 #Cpolar #国庆假期 #服务器告警 #SAM3 #Moltbook #SSH代理转发 #Miniconda #远程开发 #图像分类 #图像分割 #yolo26算法 #其他 #SEO优化 #中间件 #IndexTTS2 # 阿里云安骑士 # 木马查杀 #OBC #可信计算技术 #打卡 #计算机英语翻译 #rust #twitter #svm #amdgpu #kfd #ROCm #Java #Spring #Spring Boot #自动化巡检 #react native #mybatis #后端 #elasticsearch #版本控制 #Git入门 #开发工具 #代码托管 #麒麟 #国产化 #SSH保活 #sql注入 #everything #b/s架构 #ssm #移动学习平台 #osg #esp32 arduino #放大电路 #漏洞挖掘 #Exchange #MapGIS #云服务 #云门户 #IGServer #计算机 #连锁药店 #连锁店 #eureka #企业存储 #RustFS #对象存储 #高可用 #risc-v #安全威胁分析 #迁移重构 #代码迁移 #百度 #百度文库 #爱企查 #旋转验证码 #验证码识别 #图像识别 #聚类 #CNAS #CMA #程序文件 #STL #string #笔试 #DHCP ##程序员和算法的浪漫 #adb #fastmcp #nmodbus4类库使用教程 #jupyter #cocoa #Tetrazine-Acid #1380500-92-4 #运营 #贪心算法 #运维开发 #todesk #ZeroTermux #宝塔面板 #移动服务器 #Linux环境 #测试流程 #金融项目实战 #P2P #html5 #模型微调 #webrtc #ShaderGraph #图形 #http头信息 #门禁 #读卡器 #梯控 #门禁一卡通 #门禁读卡器 #梯控读卡器 #IC卡读卡器 #启发式算法 #azure #2026AI元年 #年度趋势 #fpga开发 #算法备案 #AI-native #dba #Kylin-Server #国产操作系统 #服务器安装 #跳槽 #业界资讯 #投标 #标书制作 #交互 #mvc #asp.net大文件上传 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #排序算法 #插入排序 #winscp #window10 #window11 #病毒 #DCOM进程 #系统进程资源占用高 #Chat平台 #ARM架构 #bond #服务器链路聚合 #网卡绑定 #CPU #claude #Docker #网络攻击模型 #omv8 #树莓派 #nas #制造 #春秋云境 #CVE-2020-5515 #spine #ipmitool #BMC #数据集 #并发 #bootstrap #Streamlit #Qwen #AI聊天机器人 #数据采集 #汇编 #企业微信机器人 #本地大模型 #隐私合规 #网络安全保险 #法律风险 #风险管理 #容斥原理 #单例模式 #typescript #Smokeping #社交智慧 #职场生存 #系统思维 #身体管理 #商务宴请 #拒绝油腻 #清醒日常 #epoll #语音识别 #统信UOS #搜狗输入法 #intellij-idea #database #idea #wordpress #雨云 # IndexTTS 2.0 # 自动化运维 #微PE #硬盘克隆 #DiskGenius #幼儿园 #园长 #幼教 #tcp/ip #智能路由器 #JavaScript #apache #余行补位 #意义对谈 #余行论 #领导者定义计划 #n8n解惑 #就业 #超算中心 #PBS #lsf #rabbitmq #反向代理 #Keycloak #Quarkus #AI编程需求分析 #SSH Agent Forwarding # PyTorch # 容器化 #带宽 #流量 #大带宽 #鸿蒙系统 #车载系统 #windows11 #系统修复 #Deepseek #gpt-3 #homelab #Lattepanda #Jellyfin #Plex #Emby #Kodi #若依 #quartz #框架 #智能手机 #用户运营 #iphone #junit #监测 #tomcat #firefox #高考 #高品质会员管理系统 #收银系统 #同城配送 #最好用的电商系统 #最好用的系统 #推荐的前十系统 #JAVA PHP 小程序 # CUDA #clickhouse #TURN # WebRTC # HiChatBox #KMS激活 #文字检测 #梁辰兴 #传输连接管理 #计算机网络基础 #Fun-ASR # 语音识别 # WebUI #LoRA # RTX 3090 # lora-scripts #.netcore #部署 #CUDA #Triton # GLM-4.6V-Flash-WEB # AI部署 #AB包 #昇腾300I DUO #长文本理解 #glm-4 #推理部署 #Tracker 服务器 #响应最快 #torrent 下载 #2026年 #Aria2 可用 #迅雷可用 #BT工具通用 #m3u8 #HLS #移动端H5网页 #APP安卓苹果ios #监控画面 直播视频流 #DooTask # 远程连接 #智能家居 #vision pro #vp9 #Puppet # IndexTTS2 # TTS #SIP服务器 #语音服务器 #VoIP #SIP协议 #gerrit #vuejs #ModelEngine #系统升级 #信创 #指针 #anaconda #虚拟环境 #编程助手 #一人公司 #独立开发者 #Gunicorn #WSGI #Flask #并发模型 #容器化 #Python #性能调优 #sqlite #ambari #智能化测试 #质量效能 #skills #playwright #持续测试 #职业和发展 #ceph #未加引号服务路径 #muduo库 #1024程序员节 #MIMO #OFDM #技术原理 #通信算法 #国产化OS #SSH跳转 #GPU服务器 #muduo #EventLoop #RustDesk # IndexTTS # GPU集群 #RSO #机器人操作系统 #vivado license #CVE-2025-68143 #CVE-2025-68144 #CVE-2025-68145 #weston #x11 #x11显示服务器 #5G #平板 #交通物流 #智能硬件 #IO #ONLYOFFICE #MCP 服务器 # 双因素认证 #n8n #nodejs #AI论文写作工具 #学术论文创作 #论文效率提升 #MBA论文写作 #ajax #esb接口 #走处理类报异常 #bug菌问答团队 #旅游 #连接数据库报错 #银河麒麟部署 #银河麒麟部署文档 #银河麒麟linux #银河麒麟linux部署教程 #AI电商客服 #6G #太赫兹 #无线通信 #频谱 #无线 #求职招聘 #copilot #uv #铬锐特 #uv胶 #紫外线胶水 #光固化胶水 #胶粘剂 #tensorflow #KMP #IndexTTS 2.0 #本地化部署 #memcache #银河麒麟操作系统 #openssh #华为交换机 #信创终端 #旅游推荐管理系统 #旅游攻略 #clawdbot #QQbot #QQ #生信 #embedding #mariadb #paddleocr #大模型应用 #API调用 #PyInstaller打包运行 #服务端部署 #AutoDL使用教程 #AI大模型训练 #linux常用命令 #PaddleOCR训练 #RPA #影刀RPA #非标机械设计 #全链路优化 #实战教程 #儿童AI #图像生成 #电气工程 #C# #cpu #数模美赛 #守护进程 #复用 #screen #计算机毕业设计 #程序定制 #毕设代做 #大作业 #课设 # 显卡驱动备份 #cursor #聊天小程序 #智能体来了 #gpt #TensorRT # 推理优化 #三维 #3D #三维重建 #信令服务器 #Janus #MediaSoup #Llama-Factory # 大模型推理 #Claude #视频去字幕 #Jetty # CosyVoice3 # 嵌入式服务器 #CVE-2025-61686 #路径遍历高危漏洞 #Ubuntu #Steam #饥荒联机版 #HeyGem # 服务器IP # 端口7860 #建筑缺陷 #红外 #需求分析 #命令模式 # GPU租赁 # 自建服务器 #遛狗 #OpenAI #故障 #优化 #MinIO服务器启动与配置详解 #双指针 #SSH复用 # Miniconda # 远程开发 #考试系统 #在线考试 #培训考试 #考试练习 #CSDN #AI助手 #轻量大模型 #mssql #GATT服务器 #蓝牙低功耗 #机器视觉 #6D位姿 #gpio #流媒体 #NAS #飞牛NAS #NVR #EasyNVR #几何学 #拓扑学 #docker-compose #fiddler #sentinel #proc #I/O #Lenyiin #UEFI #BIOS #Legacy BIOS #1panel #vmware #python学习路线 #python基础 #python进阶 #python标准库 #kmeans #opc ua #opc #GB28181 #SIP信令 #SpringBoot #视频监控 #LVDS #高速ADC #DDR # GLM-TTS # 数据安全 #xshell #host key #高级IO #TTS私有化 # 音色克隆 #ICPC #支付 #paddlepaddle #直流无刷电机 #六步换相 #ip #智能一卡通 #消费一卡通 #智能梯控 #一卡通 #超时设置 #客户端/服务器 #网络编程 #r语言-4.2.1 #r语言 #语言 #泛型 #接口 #抽象类 #面向对象设计 #ueditor导入word #ueditor导入pdf #金融投资Agent #dash #捷配 #pcb工艺 #uniapp #合法域名校验出错 #服务器域名配置不生效 #request域名配置 #已经配置好了但还是报错 #uniapp微信小程序 #区间dp #二进制枚举 #图论 #ida #软件构建 #markdown #建站 #动态规划 #字符串 #时间复杂度 #空间复杂度 #eclipse #域名注册 #新媒体运营 #网站建设 #国外域名 #HBA卡 #RAID卡 #glibc #Anaconda配置云虚拟环境 #MQTT协议 #debian #改行学it #Coze工作流 #AI Agent指挥官 #多智能体系统 #zabbix #IO编程 # 数字人系统 # 远程部署 #STUN # TURN # NAT穿透 #2026美国大学生数学建模 #2026美赛 #美赛ICM #美赛ICM Problem F #ICM赛题F #MATLAB #RAID技术 #存储 #编程语言 #智慧城市 #汇智网盘系统 #企业级云存储 #智能协作 #comfyui #8U #硬件架构 #zygote #应用进程 #Discord机器人 #云部署 #程序那些事 #mybatis # 局域网访问 # 批量处理 #claude code #codex #code cli #ccusage # 黑屏模式 # TTS服务器 #PyTorch 特性 #动态计算图 #张量(Tensor) #自动求导Autograd #GPU 加速 #生态系统与社区支持 #与其他框架的对比 #llm #领域驱动 #pytest #web3.py #Node.js #漏洞检测 #CVE-2025-27210 #串口服务器 #工业级串口服务器 #串口转以太网 #串口设备联网通讯模块 #串口服务器选型 #Ascend #MindIE # 树莓派 # ARM架构 # OTA升级 # 黄山派 #静脉曲张 #腿部健康 #pve #多进程 #python技巧 #分布式数据库 #集中式数据库 #业务需求 #选型误 #Tokio #异步编程 #系统编程 #Pin #http服务器 #在线培训系统 #pencil #pencil.dev #设计 #防火墙 #zotero #WebDAV #同步失败 #代理模式 #openvino #手机检测 #课堂手机检测 #WIN32汇编 #TcpServer #accept #高并发服务器 #算法笔记 #xeon #mapreduce #策略模式 #里氏替换原则 #AI生成 # outputs目录 # 自动化 #科普 #JT/T808 #车联网 #车载终端 #模拟器 #仿真器 #开发测试 #政务 #openEuler #LE Audio #BAP #内存接口 # 澜起科技 # 服务器主板 #简单数论 #埃氏筛法 #卷积神经网络 #参数估计 #矩估计 #概率论 #IT #技术 #uvicorn #uvloop #asgi #event #sizeof和strlen区别 #sizeof #strlen #计算数据类型字节数 #计算字符串长度 #可再生能源 #绿色算力 #风电 #yolov12 #研究生life #东方仙盟 #仙盟创梦IDE #rustdesk #图书馆 #自习室 #提词器 #芦笋提词器 #gpu #nvcc #cuda #nvidia #RXT4090显卡 #RTX4090 #深度学习服务器 #硬件选型 #api #key #AI作画 #Spring AI #AI Agent #开发者工具 #clamav #模块 #kong #Kong Audio #Kong Audio3 #KongAudio3 #空音3 #空音 #中国民乐 #计算机外设 #榛樿鍒嗙被 #scala #文生视频 #CogVideoX #AI部署 #戴尔服务器 #戴尔730 #装系统 #树莓派4b安装系统 #TCP服务器 #语音控制 #图像处理 #yolo #健身房预约系统 #健身房管理系统 #健身管理系统 #Taiji #ThingsBoard MCP # 公钥认证 #行为模式分析 #数据 #应用层 #跨领域 #敏感信息 #RTSP #Live555 #流媒体服务器 #代理 # 服务器IP访问 # 端口映射 #强化学习 #策略梯度 #REINFORCE #蒙特卡洛 #我的世界服务器搭建 #minecraft #以太网温湿度气体多参量传感器 #以太网多合一传感器 #以太网环境监测终端 #可定制气体监测模组 #算力一体机 #ai算力服务器 #V11 #kylinos #synchronized #锁 #reentrantlock #CANN #硬件 #密码 #JAVA #C₃₂H₄₅N₇O₁₁S₂ #链表的销毁 #链表的排序 #链表倒置 #判断链表是否有环 #Cesium #交互设计 #智能避障 #Qwen3-14B # 大模型部署 # 私有化AI #黑客技术 #挖漏洞 #日志分析 #Modbus #IFix #多接口并发 #首页优化 #防毒面罩 #防尘面罩 #c++20 # 环境迁移 #React安全 #漏洞分析 #Next.js #反序列化漏洞 #eBPF #seata #TC/TM/RM #web3 #Socket #AutoDL #集成学习 #EMC存储 #存储维护 #NetApp存储 #screen 命令 #grafana #人脸识别 #人脸核身 #活体检测 #身份认证与人脸对比 #H5 #微信公众号 #黑群晖 #虚拟机 #无U盘 #纯小白 #智慧校园解决方案 #智慧校园选型 #智慧校园采购 #智慧校园软件 #智慧校园专项资金 #智慧校园定制开发 #模型上下文协议 #MultiServerMCPC #load_mcp_tools #load_mcp_prompt #unix #asp.net上传文件夹 #SSH别名 #蓝湖 #Axure原型发布 #挖矿 #Linux病毒 #VMware Workstation16 #服务器操作系统 #群晖 #SAP #ebs #metaerp #oracle ebs #大模型呼叫 #外呼系统 #AI外呼 #外呼系统推荐 #智能客服 #外呼 #创业管理 #财务管理 #团队协作 #创始人必修课 #数字化决策 #经营管理 #ping通服务器 #读不了内网数据库 ##租显卡 # 远程访问 # 服务器IP配置 #框架搭建 #华为机试 #910B #昇腾 #Android16 #音频性能实战 #音频进阶 #TTS #H5网页 #网页白屏 #H5页面空白 #资源加载问题 #打包部署后网页打不开 #HBuilderX # 批量管理 #前端界面 #wireshark #C语言 #回归 #VS Code调试配置 #Deepoc #具身模型 #开发板 #未来 #收银台开源 #收银台接口 #商业开源 #K8s #镜像 #集群自动化 #后端框架 #题解 #图 #dijkstra #迪杰斯特拉 #实时检测 #tdengine #涛思数据 #MCP服务器注解 #异步支持 #方法筛选 #声明式编程 #自动筛选机制 #练习 #基础练习 #循环 #九九乘法表 #计算机实现 #SQL调优 #EXPLAIN #慢查询日志 #分布式架构 #工厂模式 #powerbi #Proxmox VE #虚拟化 #p2p #海外短剧 #海外短剧app开发 #海外短剧系统开发 #短剧APP #短剧APP开发 #短剧系统开发 #海外短剧项目 #数据可视化 #网路编程 #百万并发 #模板和元编程 #连锁门店核销 #美团团购券核销 #美团核销api #saas平台美团核销 #java接入美团团购 #rtmp #进程创建与终止 #unity3d #服务器框架 #Fantasy #can #DIY机器人工房 #江协 #瑞萨 #OLED屏幕移植 #hdfs #ROS #tcpdump #SSH免密登录 #跨域 #发布上线后跨域报错 #请求接口跨域问题解决 #跨域请求代理配置 #request浏览器跨域 #文件IO #输入输出流 #麒麟OS #React #Next #CVE-2025-55182 #RSC #游戏机 #JumpServer #UDP的API使用 #spring native #远程访问 #远程办公 #飞网 #安全高效 #配置简单 #快递盒检测检测系统 #振镜 #振镜焊接 #公共MQTT服务器 #STDIO协议 #Streamable-HTTP #McpTool注解 #服务器能力 #hibernate #逆向工程 #blender #设计师 #ngrok #iot #Dify #轻量化 #低配服务器 #claudeCode #content7 #Anything-LLM #IDC服务器 #工具集 # 目标检测 #chat #网络配置实战 #Web/FTP 服务访问 #计算机网络实验 #外网访问内网服务器 #Cisco 路由器配置 #静态端口映射 #网络运维 #journalctl #galeweather.cn #高精度天气预报数据 #光伏功率预测 #风电功率预测 #高精度气象 # 串口服务器 # NPort5630 #OSS #CDN #最佳实践 #SRS #直播 #OpenHarmony #milvus #知识库 #文本生成 #Python办公自动化 #Python办公 #LobeChat #GPU加速 #实时音视频 #Zernike #hcipy #光学设计 #像差仿真 #SEW #赛威 #SEW变频器 #UDP套接字编程 #UDP协议 #网络测试 #YOLOFuse # 水冷服务器 # 风冷服务器 #APM #AudioPolicy #音频策略 #论文复现 #翻译 #开源工具 #知识 #GESP4级 #GESP四级 #sort #滑动窗口 #智慧社区 #管理系统 #鼠大侠网络验证系统源码 #AI赋能盾构隧道巡检 #开启基建安全新篇章 #以注意力为核心 #YOLOv12 #AI隧道盾构场景 #盾构管壁缺陷病害异常检测预警 #隧道病害缺陷检测 #openlayers #bmap #tile #server #大模型面试 #ArkUI #ArkTS #鸿蒙开发 #elk #决策树 #HistoryServer #Spark #YARN #jobhistory #Java生成PDF #Freemarker转PDF #PDFBox转图片 #HTML转PDF乱码解决 #ZooKeeper #ZooKeeper面试题 #面试宝典 #深入解析 #AI技术 #SSH反向隧道 # Jupyter远程访问 #模拟退火算法 #Hadoop #客户端 #Nacos #LabVIEW知识 #LabVIEW程序 #LabVIEW功能 #nacos #银河麒麟aarch64 #系统安装 #原型模式 #空间计算 #usb #通信协议 #Kuikly #openharmony #ocr #lprnet #车牌识别 #crnn #车牌检测 #文件传输 #电脑文件传输 #电脑传输文件 #电脑怎么传输文件到另一台电脑 #电脑传输文件到另一台电脑 #reactor反应堆 #xlwings #Excel #dlms #dlms协议 #逻辑设备 #逻辑设置间权限 #运动 #IntelliJ IDEA #neo4j #NoSQL #flume #零代码平台 #AI开发 #UDP #文件管理 #文件服务器 #VibeVoice # 语音合成 # 云服务器 #环境搭建 #scanf #printf #getchar #putchar #cin #cout #pandas #mamba #凤希AI伴侣 #esp32教程 #ipv6 #AI应用 #arm64 #流量监控 #自动化运维 #测试网 #erc-20 #独立链 #polkadot #Spring源码 #UOS #海光K100 #统信 #MOXA #ms-swift # 一锤定音 # 大模型微调 #SMP(软件制作平台) #EOM(企业经营模型) #应用系统 #deepseek #SSH公钥认证 # 安全加固 #程序设计 #源码 #cpp #ue4 #DedicatedServer #独立服务器 #专用服务器 #MC #AirDrop #memory mcp #Cursor #Aluminium #Google #学工管理系统 #学工一体化平台 #学工软件二次开发 #学工平台定制开发 #学工系统服务商 #学工系统源头厂家 #智慧校园学工系统 #Shiro #CVE-2016-4437 #二值化 #Canny边缘检测 #轮廓检测 #透视变换 #联机教程 #局域网联机 #局域网联机教程 #局域网游戏 #攻防演练 #Java web #红队 #Highcharts #插件封装 #SSH跳板机 # Python3.11 #gateway #x-cmd #doubao #kimi #zhipu #claude-code #摩尔线程 #API限流 # 频率限制 # 令牌桶算法 #视觉检测 #身体实验室 #健康认知重构 #微行动 #NEAT效应 #亚健康自救 #ICT人 #Cubase #Cubase15 #Cubase14 #Cubase12 #Cubase13 #Cubase 15 Pro #Cubase 14 Pro #webgl #CS2 #debian13 #视频 #npm #VPS #搭建 #高精度农业气象 #土地承包延包 #领码SPARK #aPaaS+iPaaS #智能审核 #档案数字化 #screen命令 #渗透测试 #网安应急响应 #管道Pipe #system V #turn #ICE #信创国产化 #达梦数据库 #CPU推理 #MS #Materials #贝叶斯优化深度学习 #uvx #uv pip #npx #Ruff #国产PLM #瑞华丽PLM #瑞华丽 #PLM #网站 #截图工具 #批量处理图片 #图片格式转换 #图片裁剪 #温湿度监控 #WhatsApp通知 #IoT #MySQL #OWASP #juice-shop #安全漏洞练习靶场 #服务器开启 TLS v1.2 #IISCrypto 使用教程 #TLS 协议配置 #IIS 安全设置 #服务器运维工具 #SMTP # 内容安全 # Qwen3Guard #X11转发 #可撤销IBE #服务器辅助 #私钥更新 #安全性证明 #双线性Diffie-Hellman #GitPuk #国产开源免费代码管理工具 #Arbess #cicd工具 #一文上手 #Gateway #认证服务器集成详解 #pygame #mtgsig #美团医药 #美团医药mtgsig #美团医药mtgsig1.2 # AI翻译机 # 实时翻译 #DDD #tdd #套接字 #I/O多路复用 #字节序 # GPU服务器 # tmux #unitask #证书 #插件 #FHSS #心理健康服务平台 #心理健康系统 #心理服务平台 #心理健康小程序 # 远程运维 #性能测试 #LoadRunner #HTML #web前端 #网页开发 #JNI #TFTP #dynadot #域名 #HarmonyOS APP #N8N #spring ai #oauth2 #运维工具 #log # Base64编码 # 多模态检测 #EtherCAT #XMC4800 #工业自动化 #硬件设计 #NPU #DNS #WinDbg #Windows调试 #内存转储分析 #服务器IO模型 #非阻塞轮询模型 #多任务并发模型 #异步信号模型 #多路复用模型 #浏览器自动化 #python #cascadeur #移动端h5网页 #调用浏览器摄像头并拍照 #开启摄像头权限 #拍照后查看与上传服务器端 #摄像头黑屏打不开问题 #夏天云 #夏天云数据 #SPA #单页应用 #大剑师 #nodejs面试题 #swagger #C2000 #TI #实时控制MCU #AI服务器电源 #经济学 #入侵 #日志排查 # 大模型 # 模型训练 #Spring AOP #内网 #梯控一卡通 #电梯一卡通 #考勤一卡通 #远程桌面 #远程控制 #RK3576 #瑞芯微 #租显卡 #训练推理 #浏览器指纹 #CLI #langgraph.json #工作 #水性三防漆 #UV三防漆 #有机硅三防漆 #聚氨酯三防漆 #醇酸树脂三防漆 #丙烯酸三防漆 #raid #raid阵列 #懒汉式 #恶汉式 #gRPC #注册中心 #win11 #edge #迭代器模式 #观察者模式 #雨云服务器 #Minecraft服务器 #教程 #MCSM面板 #bigtop #hdp #hue #kerberos #一周会议与活动 #ICLR #CCF # 服务器配置 # GPU #docker安装seata ##python学习笔记 #python中with语句详解 #路由器 #欧拉 #VoxCPM-1.5-TTS # 云端GPU # PyCharm宕机 #贴图 #材质 #生产服务器问题查询 #日志过滤 #Autodl私有云 #深度服务器配置 #智能合约 #个人博客 # 键鼠锁定 #agentic bi #rdp #人脸识别sdk #视频编解码 #漏洞修复 #IIS Crypto #WinSCP 下载安装教程 #SFTP #FTP工具 #服务器文件传输 #大模型部署 #mindie #ComfyUI # 推理服务器 #音乐分类 #音频分析 #ViT模型 #Gradio应用 #libosinfo #娱乐 #手机h5网页浏览器 #安卓app #苹果ios APP #手机电脑开启摄像头并排查 #数据迁移 #测速 #iperf #iperf3 #CosyVoice3 #学术生涯规划 #CCF目录 #基金申请 #职称评定 #论文发表 #科研评价 #顶会顶刊 #嵌入式编译 #ccache #distcc #cocos2d #图形渲染 #性能 #RAM #x86_64 #数字人系统 #ARM64 # DDColor # ComfyUI #express #cherry studio #puppeteer #Fluentd #Sonic #日志采集 #面向对象 #rtsp #转发 #期刊 #SCI #GLM-4.6V-Flash-WEB # AI视觉 # 本地部署 #标准化事件委托 #工序流程工艺路径 #业务流程标准化 #音乐 #restful #鲲鹏 #nfs #iscsi #Coturn #外卖配送 #Karalon #AI Test #SMARC #ARM #YOLOv8 # Docker镜像 # 代理转发 #idm #web服务器 #程序员转型 #gnu #remote-ssh #SA-PEKS # 关键词猜测攻击 # 盲签名 # 限速机制 # 智能运维 # 性能瓶颈分析 #模版 #函数 #类 #工程实践 #数据访问 #WEB #CMake #Make #C/C++ #格式工厂 #I/O模型 #水平触发、边缘触发 #多路复用 #千问 #北京百思可瑞教育 #百思可瑞教育 #北京百思教育 #排序 # 高并发部署 #C++ UA Server #SDK #Windows #跨平台开发 #vps #simulink #寄存器 #aiohttp #asyncio #异步 #LED #设备树 #GPIO #邮箱 #postfix #dovecot #软件 #本地生活 #电商系统 #商城 #vrrp #脑裂 #keepalived主备 #高可用主备都持有VIP #软件需求 #学术写作辅助 #论文创作效率提升 #AI写论文实测 #项目申报系统 #项目申报管理 #项目申报 #企业项目申报 #safari #webpack #数智红包 #商业变革 #攻击溯源 #编程 #warp #reactjs #网络 #Go并发 #高并发架构 #Goroutine #系统设计 #net core #kestrel #web-server #asp.net-core #Zabbix #语音合成 #tekton #FASTMCP #因果学习 #vlookup #交换机 #三层交换机 #高斯溅射 #MC群组服务器 #灌封胶 #有机硅灌封胶 #聚氨酯灌封胶 #环氧树脂灌封胶 #电子灌封胶 #说话人验证 #声纹识别 #CAM++ #云开发 #AI智能棋盘 #Rock Pi S #标准IO #函数接口 #小白 #c++高并发 #BoringSSL #云计算运维 #asp.net上传大文件 #PTP_1588 #gPTP #农产品物流管理 #物流管理系统 #农产品物流系统 #农产品物流 # ARM服务器 # 鲲鹏 #4U8卡 AI 服务器 ##AI 服务器选型指南 #GPU 互联 #GPU算力 #VSCode # SSH #uip #k8s # GLM # 服务连通性 #sklearn #开发实战 #银河麒麟服务器系统 #数据恢复 #视频恢复 #视频修复 #RAID5恢复 #流媒体服务器恢复 #进程等待 #wait #waitpid #奈飞工厂算法挑战赛 # 离线AI #runtmie #文件上传漏洞 #短剧 #短剧小程序 #短剧系统 #微剧 #nosql #结构与算法 #samba #CTF #A2A #GenAI #TLS协议 #HTTPS #运维安全 #系统故障 #硬盘修复 #大学生 #RGFNet多模态目标检测 #可见光-红外图像融合目标检测 #TGRS 2025顶刊论文 #YOLO多模态创新改进 #YOLO多模态融合属于发文热点 #持续部署 #程序开发 #idc #esp32 #mosquito #效率神器 #办公技巧 #自动化工具 #Windows技巧 #打工人必备 #服务器解析漏洞 #云服务器选购 #Saas #NFC #智能公交 #服务器计费 #FP-增长 #outlook #错误代码2603 #无网络连接 #2603 #数字孪生 #三维可视化 # Qwen3Guard-Gen-8B #ETL管道 #向量存储 #数据预处理 #DocumentReader #free #vmstat #sar #SSH密钥 #smtp #smtp服务器 #PHP #intellij idea #晶振 #随机森林 #西门子 #汇川 #Blazor #cosmic #C #运维 #OpenManage #batch #springboot3 #springboot3升级 #Spring Batch #升级Spring Batch #AI视频创作系统 #AI视频创作 #AI创作系统 #AI视频生成 #AI工具 #AI创作工具 #STDIO传输 #SSE传输 #WebMVC #WebFlux #fs7TF #华为od机试 #华为od机考 #华为od最新上机考试题库 #华为OD题库 #od机考题库 #AI+ #coze #AI入门 #AI赋能 #计组 #数电 #Python3.11 #AI 推理 #NV #npu #处理器 #上下文工程 #langgraph #意图识别 #ansys #ansys问题解决办法 # 网络延迟 #ranger #MySQL8.0 #win10 #qemu #远程软件 #EDCA OS #可控AI #WRF #WRFDA #teamviewer #HarmonyOS #rsync # 数据同步 #笔记本电脑 #vertx #vert.x #vertx4 #runOnContext #传感器 #MicroPython # Connection refused #Socket网络编程 #机器人学习 # IP配置 # 0.0.0.0 #Apple AI #Apple 人工智能 #FoundationModel #Summarize #SwiftUI #istio #服务发现 #视觉理解 #Moondream2 #多模态AI #Langchain-Chatchat # 国产化服务器 # 信创 #架构设计 #YOLO识别 #YOLO环境搭建Windows #YOLO环境搭建Ubuntu #主板 #电源 # 轻量化镜像 # 边缘计算 #青少年编程 #web server #请求处理流程 #Syslog #系统日志 #日志监控 #勒索病毒 #勒索软件 #加密算法 #.bixi勒索病毒 #数据加密 #OPCUA #CA证书 #星际航行 #opc模拟服务器 #工程设计 #预混 #扩散 #燃烧知识 #层流 #湍流 #Host #SSRF # 批量部署 # ms-swift #服务器线程 # SSL通信 # 动态结构体 #报表制作 #职场 #用数据讲故事 #语音生成 #个人助理 #数字员工 #KMS #slmgr #宝塔面板部署RustDesk #RustDesk远程控制手机 #手机远程控制 #铁路桥梁 #DIC技术 #箱梁试验 #裂纹监测 #四点弯曲 # 服务器迁移 # 回滚方案 #节日 #ESP32编译服务器 #Ping #DNS域名解析 #麦克风权限 #访问麦克风并录制音频 #麦克风录制音频后在线播放 #用户拒绝访问麦克风权限怎么办 #uniapp 安卓 苹果ios #将音频保存本地或上传服务器 #开关电源 #热敏电阻 #PTC热敏电阻 #moltbot #地理 #遥感 #IPv6 #安全性测试 #taro #AI应用编程 #电路仿真 #proteus #AD #keil #硬件工程师面试 # REST API #游戏服务器断线 # keep-alive #闲置物品交易系统 #前端开发 #EN4FE #Archcraft #自由表达演说平台 #演说 #全文检索 #Minecraft #PaperMC #我的世界服务器 #范式 #万悟 #联通元景 #国产开源制品管理工具 #Hadess #devops #ET模式 #非阻塞 #glances #duckdb #Comate #bug # 硬件配置 #API #阿里云RDS #磁盘配额 #存储管理 #形考作业 #国家开放大学 #系统运维 #408 #线索二叉树 #lucene #coffeescript #H3C # ControlMaster #传统行业 #tornado #b树 #VMware创建虚拟机 #昭和仙君 #数据库架构 #Qwen3-VL # 服务状态监控 # 视觉语言模型 #传媒 #隐函数 #常微分方程 #偏微分方程 #线性微分方程 #线性方程组 #非线性方程组 #复变函数 #UDP服务器 #recvfrom函数 #个人电脑 #Termux #Samba #Ward #递归 #线性dp #IPMB #远程管理 #日志模块 #音诺ai翻译机 #AI翻译机 # Ampere Altra Max # 权限修复 #WAN2.2 #xml #ASR #SenseVoice #VMWare Tool #网络安全大赛 #llvm #智能制造 #供应链管理 #工业工程 #库存管理 #量子计算 #DAG #pxe #NSP #下一状态预测 #aigc #算力建设 #MinIO #RK3588 #RK3588J #评估板 #核心板 #嵌入式开发 #声源定位 #MUSIC #resnet50 #分类识别训练 #ServBay #Xshell #Finalshell #生物信息学 #组学 #Spire.Office #智能体对传统行业冲击 #行业转型 #代理服务器 #Matrox MIL #二次开发 #0day漏洞 #DDoS攻击 #漏洞排查 #odoo # DIY主机 # 交叉编译 #appche #c #CS336 #Assignment #Experiments #TinyStories #Ablation #ftp #sftp #bochs #车载嵌入式 #PN 结 #ARMv8 #内存模型 #内存屏障 #RWK35xx #语音流 #实时传输 #node #AE #canvas层级太高 #canvas遮挡问题 #盖住其他元素 #苹果ios手机 #安卓手机 #调整画布层级 #AITechLab #cpp-python #CUDA版本 #js #gmssh #宝塔 #POC #问答 #交付 #基础语法 #标识符 #常量与变量 #数据类型 #运算符与表达式 #SQL注入主机 #Linly-Talker # 数字人 # 服务器稳定性 #总体设计 #电源树 #框图 #向量嵌入 #边缘AI # Kontron # SMARC-sAMX8 #解释器模式 #okhttp #剪枝 #人脸活体检测 #live-pusher #动作引导 #张嘴眨眼摇头 #苹果ios安卓完美兼容 #小艺 #搜索 #毕设定制 #建造者模式 #多模态 #微调 #超参 #LLamafactory #动画 #海量数据存储 #Linux多线程 #cesium #可视化 #熵权法 #灰色关联分析 #信息收集 #poll #AI零代码开发 #敏捷开发 #自然语言编程 #软件开发范式变革 #信奥赛 #提高组 #csp-s #初赛 #真题 # 模型微调 #AI教材写作工具 #AI创作技术 #教材编写实战 #创作效率优化 #远程更新 #缓存更新 #多指令适配 #物料关联计划 #个性化推荐 #BERT模型 #Prometheus #思爱普 #SAP S/4HANA #ABAP #NetWeaver #人形机器人 #人机交互 #统信操作系统 #Arduino BLDC #核辐射区域探测机器人 #vncdotool #链接VNC服务器 #如何隐藏光标 #电梯 #电梯运力 #电梯门禁 #数据报系统 #boosting #AI写作工具 #教材编写效率提升 #AI教材编写 #教材编写难题解决 #教育领域AI应用 # 高温监控 #AI工具集成 #容器化部署 #2025年 #AI教程 #RS232 #RS485 #RS422 #CMC #英语学习 #基金 #股票 #大数据分析 #ossinsight #adobe #SQL注入 #WAF绕过 #小智 #godot # child_process #分子动力学 #化工仿真 #session #JADX-AI 插件 #boltbot #对话框 #Dialog #桌面开发 #MessageDialog #QInputDialog #电子电气架构 #系统工程与系统架构的内涵 #Routine #starrocks #RIP #结构体与联合体 #全排列 #回溯 #STJ算法 #L6 #L10 #L9 #Beidou #北斗 #SSR #composer #symfony #java-zookeeper #Unity #游戏服务器 #保姆级教程 #电机正反转 #TMC2240 #DIR引脚控制 #二维数组 #传统服饰销售平台 #爬虫实战 #零基础python爬虫教学 #双色球历史开奖数据 #期号红球篮球开奖日期等 #结构化CSV存储 #DuckDB #协议 #FunASR #语音转文字 #Springboot3.0 #MCP SDK #xcode #开题报告 #jquery #fork函数 #进程创建 #进程终止 #CVE-2025-13878 #CWE-617 #远程攻击 #BIOS中断 #Docsify #技术博客 #知识点