直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的

import socket

server = socket.socket()

server.bind(('127.0.0.1', 8080))  # 注意bind是server的一个方法,规定传两个参数,一个是它基本本身,另一个
# 就是ip端口地址,所以我们用元组的方式传参 server.listen(5) # 设置监听数,同一时刻,最多与五个客户端进行通信 print('正在监听8080端口.......')
while True:
conn, address = server.accept() # 有客户端连接才会执行到这里,并且返回两个参数,一个是跟改客户端进行通信的套接字,一个是该客户端的ip地址
data = conn.recv(1024) print(data) # 这里我们先打印下客户端到底给我们传来了什么数据 conn.send(b'hello word') # 接收到数据,我们也向web页面返回一个信息, conn.close() # 关闭套接字
# 记住一点,socket,他们之间发送的数据都是二进制的格式
# 下面是我print(data)的打印效果,我做了适当的换行操作,因为\r\n就是换行嘛,这就是通过浏览器访问我写的服务端带来的数据
# 我就在下面代码写写自己注释了。
# 不知道你们跟着写了没有,但是我这里通过火狐,IE浏览器访问,页面内容是hello word,谷歌浏览器的页面不能解析b'hello word'
# 出现这样的情况,肯定是火狐,IE浏览器它内部给你封装了,所以页面能显示hello word
# 按理说,浏览器向服务端按着某种格式发送(也就是下面这段),服务端应该也要发送某种格式的信息给浏览器,这样才浏览器才能解释。
''' GET / HTTP/1.1\r\n #这是请求首行
请求方式 url http协议版本号\r\n #这就是请求首行的内容,注意有空格,必须要有空格。\r\n记得换行就行了 Host: 127.0.0.1:8080\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\n
Accept-Encoding: gzip, deflate\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n\r\n' #这上面的就是请求头,key:value ............ #如果是post方法去请求的话,....的位置就是请求体了,我举得例子是get请求,所以就没有请求体,
但是请求体是有的。 '''
# 那么服务端应该以那种格式,响应回浏览器呢?

'HTTP/1.1 200 ok\r\n\r\n你要响应过去的数据'

# 上面的格式中 200是状态码,ok就是状态码的原因短语,两个换行符下面就是响应体了
# 所以我直接接着while循环那里更改 while True:
conn, address = server.accept()
data = conn.recv(1024)
conn.send(b'HTTP/1.1 200 ok\r\n\r\nhello word')
conn.close()
'''
思考拓展:首先我们可以通过浏览器带来请求的数据中,找到它指定的url(这个信息就在请求首行中),
我们可以通过字符串的一些方法,拿到,再进行判断,如果是index就返回index的页面,也就是根据
相应的url,我们返回相应的网站。
说到网站,我们怎么将网站返回过去呢?首先在你的服务端机器上必须要有这个网页,我们可以通过文
件的读取,将内容通过二进制返回过去。
既然说了,那下面我就写写,还是接着最开始while循环开始
''' while True:
conn, address = server.accept()
data = conn.recv(1024)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
data = str(data, encoding='utf-8') # 为什么这样操作,之前写了
url = data.split('\r\n')[0].split(' ')[1] # data数据上面有,通过这样我们找到url
info = None
if url == '/index':
with open('index.html', 'rb') as f:
info = f.read()
else:
info = b''
conn.send(info)
conn.close() # 注意了没有,上面代码我写了两句conn.send,这样写也是可以的,因为tcp是流式协议。
# 我就写了一个逻辑操作,方法就是这样,会了的话,自己再多添几个就行了,但是必须你本地要有该网页

socket手写一个简单的web服务端的更多相关文章

  1. 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功

    #!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop():     print("Content-type: ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  4. linux系统下开启一个简单的web服务

    linux 下开启一个简单的web服务: 首先需要linux下安装nodejs 然后创建一个test.js:   vi test.js var http =require("http&quo ...

  5. node创建一个简单的web服务

    本文将如何用node创建一个简单的web服务,过程也很简单呢~ 开始之前要先安装node.js 1.创建一个最简单的服务 // server.js const http = require('http ...

  6. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  7. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  8. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  9. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

随机推荐

  1. python搭建本地服务器

    python搭建本地服务器 python3以上版本 'python3 -m http.server 8000' 默认是8000端口,可以指定端口,打开浏览器输入http://127.0.0.1:800 ...

  2. poi学习

    需要节点  <dependency>  <groupId>org.apache.poi</groupId>  <artifactId>poi</a ...

  3. 关于Java中用Double型运算时精度丢失的问题

    注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...

  4. CSS 面包屑导航栏

    做之前,先看一下效果图. demo01.png 首先,书写好 HTML 代码. <div id="crumbs"> <ul> <li><a ...

  5. rest-framework框架——解析器、ur控制、分页、响应器、渲染器、版本

    一.解析器(parser) 解析器在reqest.data取值的时候才执行. 对请求的数据进行解析:是针对请求体进行解析的.表示服务器可以解析的数据格式的种类. from rest_framework ...

  6. CSS实现文本周围插入符号

    CSS实现文本周围插入符号的方案 本文要讨论的是如何在文本的周围插入图标,怎么样控制它们之间的位置关系,通过HTML结构合理性与CSS属性的使用来比较不同方案所实现效果的优缺点. 常见设计稿要求 在文 ...

  7. POJO对象

    POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和 EJB混淆起来, 而且简 ...

  8. [转]chrome developer tool 调试技巧

    这篇文章是根据目前 chrome 稳定版(19.0.1084.52 m)写的, 因为 google 也在不断完善chrome developer tool, 所以 chrome 版本不同可能稍有差别. ...

  9. 详细分析UserLock如何保证高校内部信息安全

    俄克拉荷马城市公立学校的IT团队负责该片区接近43000个学生的网络管理工作.长期以来,学生和教师员工共享Windows网络登录为他们带来了很多难题. 由于没有并发登录的限制,也不能对网络使用情况进行 ...

  10. siebel学习笔记-应用/数据访问控制

    应用/数据访问控制Siebel提供的两种主要的访问控制方式在View级别和Data(record)级别: 1.View级别的访问控制:一个企业通常按照功能进行工作的区分,分配给一个用户的功能决定了他能 ...