✨✨欢迎来到T_X_Parallel的博客!!
🛰️博客主页:T_X_Parallel
🛰️项目代码仓库:站内搜索引擎项目代码仓库
🛰️专栏 : 站内搜索引擎项目
🛰️欢迎关注:👍点赞🙌收藏✍️留言
项目环境:vscode、wsl(Ubuntu22.04)、g++/CMake
技术栈:C/C++ C++11、STL、标准库 Boost、Jsoncpp、cppjieba、cpp-httplib、html
1. cpp-httplib库安装及使用
cpp-httplib库的安装
这个下载方法和前面的cppjieba
库的安装方法相似,具体过程如下
- 第一步转到存放第三方库目录下(前面的
cppjieba
库中已经提到可以创建一个专门的第三方库文件夹)cd ~/thirdpart/
- 第二步使用
git
拷贝cpp-httplib库git clone https://gitee.com/eipoz-opensource/cpp-httplib.git
这样就是下载到我们的机器中了,该项目中主要使用的是httplib.h中的东西,所以像cppjieba
库一样,在项目中使用需要使用链接
cpp-httplib使用方法
首先想要在项目中使用该库,就必须像cppjieba库一样链接到项目中
// 先转到项目目录下
cd /path/to/项目名/
// 链接cpp—httplib库
ln -s ~/thirdpart/cpp-httplib cpp-httplib
然后做一个测试,测试该库能不能正常使用(该库的下载仓库中有测试例子可以直接使用,cpp-httplib)
#include "../cpp-httplib/httplib.h"
int main()
{
httplib::Server svr;
svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
res.set_content("Hello World!", "text/plain");
});
svr.listen("0.0.0.0", 8080);
return 0;
}
// g++ -o test.exe test.cc -lpthread -std=c++11 编译
运行结果:
证明该库能够正常使用
使用注意事项
情况一
如果你在编译测试代码时不通过或者运行报错时,如果代码没有问题的情况下,那可能就是你的Linux机器中的gcc版本过低,该库需要较新的编译器,下面是一些解决方法
- CentOS
// 安装开发工具包: sudo yum groupinstall 'Development Tools' // 启用SCL(Software Collections): sudo yum install centos-release-scl // 安装GCC: sudo yum install devtoolset-9 // 启用新的GCC版本: scl enable devtoolset-9 bash // 验证GCC版本: gcc --version
注:运行
scl enable devtoolset-9 bash
命令后重新打开机器需要重新再执行该命令,为了方便可以修改系统中的一个文件,每次机器开机都会执行里面的命令cat ~/.bash_profile // 文档最后加上并保存文件即可 scl enable devtoolset-9 bash
- Ubuntu
// 更新包列表: sudo apt update // 安装软件属性通用包: sudo apt install software-properties-common // 添加工具链测试版PPA: sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update // 安装最新版本的GCC: sudo apt install gcc-10 g++-10 // 更新默认GCC版本: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 // 选择默认GCC版本: sudo update-alternatives --config gcc sudo update-alternatives --config g++ // 验证GCC版本: gcc --version
情况二
gcc
不是特别新的话,使用最新的cpp-httplib
库也会出错,建议可以使用老版本的cpp-httplib
库
这里面涵盖了每个发行版本的源文件,以.zip文件格式下载到windows机器上,再传到Linux机器解压即可
情况三
编译出现链接pthread
库问题,该库中使用了pthread
库,所以在编译测试以及后面的程序代码时需要链接pthread
库,对应修改命令、makefile文件和CMakeList.txt文件即可
2. http网络模块(后端主程序)实现
这个模块实现相对简单,因为使用了现成的库来加入http,不需要自己写http,调用cpp-httplib库中的函数即可。该模块的大致结构和上一个模块中的测试的代码结构大致相似,只是在该部分的代码最后使用的http而不是命令行,废话不多说,直接开始实现。
首先肯定就是定义一个
Searcher
类对象searcher
并初始化,以便下面调用然后定义一个
httplib::Server()
对象svr
再使用
svr.set_base_dir()
设置主页面(主页面使用html,在下一个前端模块再实现)然后使用
svr.Get()
,第二个参数为传入函数,使用lambda表达式写一个函数即可,在该函数中使用req.has_param()
判读用户是否输入关键词,再用req.get_param_value()
获取用户输入信息,并调用searcher.Search()
进行搜索,最后使用res.set_content()
将搜索结果返回给用户最后使用
svr.listen()
函数进行监听
从上面结果可以看出,使用第三方库后可以极大程度缩减开发成本
3. 网络模块实现代码
#include "searcher.hpp"
#include "../cpp-httplib/httplib.h"
const std::string intput_path = "../data/raw_html/raw.txt";
const std::string root_path = "./wwwroot/";
int main()
{
// 创建searcher实例
ns_searcher::Searcher searcher;
searcher.InitSearcher(intput_path);
httplib::Server svr;
svr.set_base_dir(root_path);
svr.Get("/search", [&searcher](const httplib::Request& req, httplib::Response& res){
if (!req.has_param("q"))
{
res.set_content("必须有搜索词", "text/plain; charset=utf-8");
return;
}
std::string keywords = req.get_param_value("q");
std::cout << "用户输入关键词:" << keywords << std::endl;
std::string json_string;
searcher.Search(keywords, &json_string);
res.set_content(json_string, "application/json");
});
svr.listen("0.0.0.0", 8081);
return 0;
}
Get()
函数中使用到了"/search"
和"q"
,这两个参数可以自己自定义,决定最后测试时的输入格式以及影响到下一个前端模块中实现时使用的参数
4. 测试
与上个模块相同,测试可以自行选择编译方式,废话少说,下面提供三种编译方式的文件或者指令
- 命令行
g++ -o http-server.exe http-server.cc -lcppjson -lpthread -std=c++11 # g++ -o http-server http-server.cc -lcppjson -lpthread -std=c++17
- makefile
PARSER=parser DUG=debug HTTP-SERVER=http-server cc=g++ .PHONY:all all:$(PARSER) $(DUG) $(HTTP-SERVER) $(PARSER):parser.cc $(cc) -o $@ $^ -lboost_system -lboost_filesystem -std=c++11 $(DUG):debug.cc $(cc) -o $@ $^ -ljsoncpp -std=c++11 $(HTTP-SERVER):http-server.cc $(cc) -o $@ $^ -ljsoncpp -lpthread -std=c++11 .PHONY:clean clean: rm -f $(PARSER) $(DUG) $(HTTP-SERVER)
- CMake
cmake_minimum_required(VERSION 3.10) project(Boost_Search_Engine) # # 设置C++标准为C++11、C++17 add_compile_options(-std=c++11 -std=c++17) # 查找Boost库 find_package(Boost REQUIRED COMPONENTS filesystem system) # 查找cppjson库 find_package(jsoncpp REQUIRED) # 查找pthread库 find_package(Threads REQUIRED) # 查找OpenSSL库 find_package(OpenSSL REQUIRED) # 添加可执行目标 Parser add_executable(Parser ./code/parser.cc) # 链接Boost库到 Parser target_link_libraries(Parser ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY}) # 添加可执行目标 Debug add_executable(Debug ./code/debug.cc) # 链接cppjson库到 Debug target_link_libraries(Debug jsoncpp_lib) # 添加可执行目标 Http-Server add_executable(Http-Server ./code/http-server.cc) # 链接pthread库、cppjson库和OpenSSL库到 Http-Server target_link_libraries(Http-Server PRIVATE jsoncpp_lib Threads::Threads)
最后的测试结果图如下
注意测试时需在浏览器中输入的内容
- 使用云服务器的Linux
运行可执行程序后,在windows下的浏览器输入
公网ip:8081/search?q=split
- 使用wsl
运行可执行程序后,在windows下的浏览器输入
localhost:8081/search?q=split
或者ip:8081/search?q=split
这里的ip需要在wsl中用下面这个命令查看,不能在windows下的命令行使用ipconfig查到的ip(博主测试过)
hostname -I
- 使用虚拟机
该方式博主没有测试,请自行查找相关博客或者询问AI
下一个就是前端模块了,做完前端模块后就是细节优化部分,期待一下吧
专栏:站内搜索引擎项目
项目代码仓库:站内搜索引擎项目代码仓库(随博客更新)
都看到这里了,留下你们的珍贵的👍点赞+⭐收藏+📋评论吧