写在前面的一些P话:

在公司网站开发中,我们往往借助于Flask、Django等网站开发框架去提高网站开发效率。那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么?

我们不止仅仅会使用框架开发,还需要知其所以然

今天领大家不借助任何框架的基础上手动搭建一个资料查找网站
点击此处找管理员免费领取资料

主要内容

  • TCP网络模型
  • 正则表达式匹配资源
  • 如何编写一个tcp server服务端

开始我们的代码,先是导入模块

如何实现一个静态的服务器呢? 可以使用Python自带的一个通讯模型:socket

python中内置的网络模型库tcp / udp

import socket

为浏览器发送数据的函数

1. 当浏览器链接到网站服务器的时候

def service_client(new_socket):
request = new_socket.recv(1024)
print(request)

2. 向浏览器发送http数据
如果浏览器在接收完http协议数据之后遇到了换行,自动将下面的数据转成网站内容body中去

response = 'HTTP/1.1 200 OK \r\n'
response += '\r\n'
# 构建你想要显示的数据内容
response += 'hello world'

3. 浏览器接受到的数据是由编码集的,所以我们需要对字符串进行一次编码

 new_socket.send(response.encode('utf-8'))

4. 当服务完浏览器之后,需要释放系统资源

new_socket.close()

创建一个执行函数

1. 创建一个tcp套接字
socket模块需要两个参数 网络协议(pc ipv4 ipv6) 模型类型

def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

我们操作系统内部有65535个服务端口,当一个程序运行的时候[进程] 占用一个端口
浏览器软件运行占用的端口:80
文件上传端口:22
网站指定端口:443

端口是有限的,当程序完成任务之后一定要释放端口 刷新资源
2. 当网站服务中断时 需要立即释放端口

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

3.绑定本机信息

tcp_server_socket.bind(('', 80))

通过浏览器去访问网站资源 [数据 html css JavaScript 静态文件(图片 音频)]
需要让浏览器首先能找到这台电脑 ip 才可以访问这台电脑的数据资源
需要绑定电脑的ip地址
4.将网站服务设置成监听模式
等待浏览器链接

tcp_server_socket.listen(128)

网站服务

    while True:
'''
new_socket 负责向浏览器发送数据的
client_addr 记录当前链接电脑的信息(ip port)
'''
new_socket, client_addr = tcp_server_socket.accept()
service_client(new_socket)
# 使用new_socket向浏览器发送数据

启动程序

if __name__ == "__main__":
main()

运行代码


出现乱码,可以把utf-8改为GBK

最新文章

  1. Java中堆的实现类PriorityQueue队列接口Queue
  2. vmware workstation unrecoverable error: (vmui)报错解决方法
  3. linux_oracle_healthcheck.sh
  4. codeforces B. Dima and Text Messages 解题报告
  5. php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27)
  6. PHP curl传输文件的版本兼容性
  7. JSP简单练习-数组应用实例
  8. adb devices找不到设备解决办法
  9. xBIM WeXplorer
  10. 学习UI的总结
  11. 洛谷P1047校门外的树题解
  12. 一次完整的http事务的过程
  13. 2019-03-28-day021-抽象类与接口类
  14. 【Algorithm】希尔排序
  15. 一个自动换行,不可以滚动的 textview
  16. Eclipse错误笔记!
  17. python 2/3 joblib.dump() 和 joblib.load()
  18. floyd算法&迪杰斯特拉算法
  19. 有道单词导入 有道单词 生词本 批量导入 添加 有道单词XML 背单词
  20. qs.parse()、qs.stringify()、JSON.stringify() 用法及区别

热门文章

  1. 微信开发者工具:Cannot read property 'addEventListener' of undefined 报错
  2. Codeforces Round #741 (Div. 2), problem: (D1) Two Hundred Twenty One (easy version), 1700
  3. go interface{}使用
  4. java高级用法之:在JNA中使用类型映射
  5. 2021.07.02 UVa1197 多路归并模板
  6. Ubuntu 下 firebird 数据库的安装和配置
  7. 小程序开发之获取客户来源 scene 场景值 手机设备信息
  8. 关于 background-image 渐变gradient()那些事!
  9. vue2响应式原理与vue3响应式原理对比
  10. 【笔记】排查CPU占用过高