网页数据串入tcp服务器,6基于TCP的WEB服务器

客户端模拟

我们模拟浏览器客户端,访问www.icoderi.com。我们自己做一个请求报文,方式get,就没有请求数据,由请求行,请求头,请求空行组成,我们先打印下从服务器接收到的数据

27a4667cb428

图1

把打印内容贴到记事本中,可以看到服务器发来的是响应报文

27a4667cb428

图2

将data二进制decode一下就可以得到解码后的内容

27a4667cb428

图3

我们想获得响应数据,可以用字符串定位\r\n\r\n的索引,然后+4得到index,再用切片就OK了,我们可以将这部分内容存到.html文件写入,然后打开就是和浏览器输入url一样的效果

27a4667cb428

图4

返回固定数据

做一个我们要一个web服务器,不管你请求的什么页面,我都返回固定内容

27a4667cb428

图5

预计的整体功能

27a4667cb428

图6

我们尝试写代码,这里setsockopt允许端口地址重用,防止socket已被使用出现。这里注意当时用360浏览器开始一直连接不上页面,后来用谷歌浏览器就好了。这里判断浏览器送来数据为空的时候做个判断,因为浏览器默认会发出请求报文,没收到,证明断开连接

27a4667cb428

图7

浏览器访问后,有如下效果

27a4667cb428

图8

返回固定页面

27a4667cb428

图9

其实这里比起上一步不过是多了将服务器内的.html文件进行open读取后作为响应数据部分返回

这里需要注意的是需要将html文件rb读取,因为页面不止包括文本内容。由于课件没有,我只有网页本地保存了个海贼王吧的,用于试水

27a4667cb428

图10

谷歌浏览器打开结果,OK!,当然在端口后面加各种xxx.html都一样。

27a4667cb428

图11

返回指定页面

我们浏览器访问有时候是想访问获得对应的内容,如下图,我们服务端就是要做出这个功能,根据用户请求的不同资源,给与不同的响应。

27a4667cb428

图12

我们之前做过返回固定页面,比如我们请求/a/1.html,F12能看到请求头数据,我们就根据请求行要访问的路径,打开服务器对应的文件进行返回

27a4667cb428

图13

我们请求页面时,会发现浏览器给我们请求了内容的同时,也给我们请求了一个网站.ico文件用于浏览器上面小图标显示。这个ico文件一般至于/根目录下

于是我们有了如下代码,这里accept部分,和请求响应放入while循环,让请求了资源的同时还能请求到ico图标,请求路径利用2次分割即可

27a4667cb428

图14

由于这里我是windows上编程,用了os.getcwd(),其实文件就在桌面上,我们可以看到打开效果

27a4667cb428

图15

这里因为是本地保存的页面,自带ico

27a4667cb428

图16

返回指定页面注意的问题

视频中上次代码没有加对没有的资源应对,这样服务器自身会运行出错,但是我的代码已经加了404了

这回我们应该把响应内容加上,即错误提示,之前好像是空字符串

27a4667cb428

图17

我们访问不存在的资源就会有如下结果

27a4667cb428

图18

如果用户访问根目录,我们要设置给其返回默认首页,不然就进入了404

面向对象封装

将服务器创建使用类实现,没啥说的

27a4667cb428

图19

服务端基础框架构建

27a4667cb428

图20

我们之前编写了服务器面向对象,现在我们把requsest_handler重写成app模块,通过调用app模块的函数,返回数据给浏览器即可,中间又将解析代码获得资源路径单独摘出函数,总之是进一步面向对象而已。不过这样的好处是将功能分割,方便单独调试函数,防止接手新人看不懂

27a4667cb428

图21

我们还可以写一个utils.py,里面写一个函数create_http_response,传入参数状态码字符串和响应体,将拼接处理放在函数内,最后返回二进制报文

命令行启动服务器

我们的服务器不会装pycharm,我们只有终端运行写好的py程序

27a4667cb428

图22

27a4667cb428

图23

sys.argv[0]是py文件,[1]是后续字符串

案例:网游服务器

比如我们游戏服务器有很多游戏,每个游戏存储于不同目录,我们根据用户选择不同游戏请求不同资源

27a4667cb428

图24

视频中是使用已有的web游戏资源,放在几个文件夹中,根据不同人访问不同游戏,将资源路径带参数传入其中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值