服务器 4.说到服务器模块,这里我承认这确实不是我的强项,我是做后端开发的,前端的js,css,html这些都是一知半解,也就够拿来写个小小的简单的站内搜索,果然学习之路任重道远啊。 http协议,作为非常重要的应用层协议,遇到和使用到的概率非常的大。http的协议各是是这样的: 1)请求:首行(方法,url,版本) + header(键值对结构) + 空行 + body 2)响应:首行(状态,状态码,描述) + header(键值对结构) + 空行 + body 所谓的http服务器本质上就是一个TCP服务器,通过这些socket,api,按照TCP协议的方式来处理数据,处理过程中再根据http协议的格式进行解析请求和构造响应。这里用到cpp-httplib这个实现好的库来完成需求。 通过svr.Get()函数把url关联到一个具体的回调函数,使得我们不用自己决定何时调用,而是把函数交给库或者框架,由第三方决定何时调用。回调函数的工作核心就是根据请求计算响应,把响应结果写在response对象中。再通过svr.listen()启动服务器,绑定ip及端口。 服务器构建好以后,最繁杂的步骤来了——设计一个美观合理的页面。我们的搜索页面大致长这样: HTML的基本特点是: 1.由标签<xxx>开始,由标签</xxx>结束; 2.开始标签和结束标签中夹得就是内容; 3.内容也是标签时,标签之间这样的嵌套关系成为“父子关系”; 一个html文件,其核心是一个html标签,里面包含head和body标签。 而html只能实现一个页面的骨架,想让页面好看起来,还得用CSS。在<head>标签中加一对<style>标签就可以加入CSS的内容。CSS是由‘选择器 + 属性’构成其基本语法的,选择器选择针对哪个html生效,而属性则设置要改成什么样子。 经过一番修改后我们的页面已经有了模样: 而要实现搜索功能,则需要JS来完成了。JavaScript是一种风格接近于c的编程语言,通过它可以实现一些逻辑,包括感知用户的点击按钮,感知搜索框的内容,给服务器发送请求以及根据服务请求来绘制页面。JS原生的API操作界面十分的复杂,我们选择通过外部库来简化操作——JQuery。 一番设计与操作之后,我们在网址栏输入预先确定好的网址,输入查询词“filesystem”,点击搜索之后,当当当当! 画面已经变成了这个样子,点击跳转页面: 访问无误。 至此,基于boost文档的搜索引擎彻底开发完毕。 回顾整个项目,从后台开发到前端设计,无不体现着技术的进步,从一开始的简单遍历难以设计,到最后的非专业知识的前端已经可以做的很好看(自认为),做项目带来的收获是理论知识难以比拟的。而作为一个搜索引擎,和商业搜索引擎相比还有很多的差距: 1.支持的数据量差距(boost离线版本的html才5800多个) 2.请求量的差距(毕竟现在搜索测试只在自己的电脑上完成) 3.业务复杂度与级别的差距(索引校验,权重描述,过滤规则,接口调试......) 还有许许多多的差距是这个小的站内搜索引擎没能实现的,希望将来有一天,我们也能把他做的像github上许多开源的大型搜索引擎一样好。