客户端模拟
我们模拟浏览器客户端,访问www.icoderi.com。我们自己做一个请求报文,方式get,就没有请求数据,由请求行,请求头,请求空行组成,我们先打印下从服务器接收到的数据
图1
把打印内容贴到记事本中,可以看到服务器发来的是响应报文
图2
将data二进制decode一下就可以得到解码后的内容
图3
我们想获得响应数据,可以用字符串定位\r\n\r\n的索引,然后+4得到index,再用切片就OK了,我们可以将这部分内容存到.html文件写入,然后打开就是和浏览器输入url一样的效果
图4
返回固定数据
做一个我们要一个web服务器,不管你请求的什么页面,我都返回固定内容
图5
预计的整体功能
图6
我们尝试写代码,这里setsockopt允许端口地址重用,防止socket已被使用出现。这里注意当时用360浏览器开始一直连接不上页面,后来用谷歌浏览器就好了。这里判断浏览器送来数据为空的时候做个判断,因为浏览器默认会发出请求报文,没收到,证明断开连接
图7
浏览器访问后,有如下效果
图8
返回固定页面
图9
其实这里比起上一步不过是多了将服务器内的.html文件进行open读取后作为响应数据部分返回
这里需要注意的是需要将html文件rb读取,因为页面不止包括文本内容。由于课件没有,我只有网页本地保存了个海贼王吧的,用于试水
图10
谷歌浏览器打开结果,OK!,当然在端口后面加各种xxx.html都一样。
图11
返回指定页面
我们浏览器访问有时候是想访问获得对应的内容,如下图,我们服务端就是要做出这个功能,根据用户请求的不同资源,给与不同的响应。
图12
我们之前做过返回固定页面,比如我们请求/a/1.html,F12能看到请求头数据,我们就根据请求行要访问的路径,打开服务器对应的文件进行返回
图13
我们请求页面时,会发现浏览器给我们请求了内容的同时,也给我们请求了一个网站.ico文件用于浏览器上面小图标显示。这个ico文件一般至于/根目录下
于是我们有了如下代码,这里accept部分,和请求响应放入while循环,让请求了资源的同时还能请求到ico图标,请求路径利用2次分割即可
图14
由于这里我是windows上编程,用了os.getcwd(),其实文件就在桌面上,我们可以看到打开效果
图15
这里因为是本地保存的页面,自带ico
图16
返回指定页面注意的问题
视频中上次代码没有加对没有的资源应对,这样服务器自身会运行出错,但是我的代码已经加了404了
这回我们应该把响应内容加上,即错误提示,之前好像是空字符串
图17
我们访问不存在的资源就会有如下结果
图18
如果用户访问根目录,我们要设置给其返回默认首页,不然就进入了404
面向对象封装
将服务器创建使用类实现,没啥说的
图19
服务端基础框架构建
图20
我们之前编写了服务器面向对象,现在我们把requsest_handler重写成app模块,通过调用app模块的函数,返回数据给浏览器即可,中间又将解析代码获得资源路径单独摘出函数,总之是进一步面向对象而已。不过这样的好处是将功能分割,方便单独调试函数,防止接手新人看不懂
图21
我们还可以写一个utils.py,里面写一个函数create_http_response,传入参数状态码字符串和响应体,将拼接处理放在函数内,最后返回二进制报文
命令行启动服务器
我们的服务器不会装pycharm,我们只有终端运行写好的py程序
图22
图23
sys.argv[0]是py文件,[1]是后续字符串
案例:网游服务器
比如我们游戏服务器有很多游戏,每个游戏存储于不同目录,我们根据用户选择不同游戏请求不同资源
图24
视频中是使用已有的web游戏资源,放在几个文件夹中,根据不同人访问不同游戏,将资源路径带参数传入其中