【python--程序】python-socket实现简单网页服务器_python使用socket创建网页-程序员宅基地

技术标签: python  

前言

最近有粉丝建议博主出一篇讲使用socket进行实际编程应用的帖子。这里博主就讲使用Python socket实现简单的网页服务器.

前题准备

当前实验将会使用tcp的80端口,请各位读者将当前电脑的网页服务器的80端口修改或关闭。
本教材使用python (版本:3.7.2,使用python3即可)

工作过程

这里我们先简单介绍下服务器是如何响应浏览器访问的:

1. 建立连接。 
   既然是提供服务,就需要服务器先绑定一个地址及端口用于响应网页请求的。
这里我们先绑定地址位:0.0.0.0。为啥是0.0.0.0呢?相当于将当前服务绑定到了
当前设备所以可以使用的网卡上。比如说我有无线和有线,两张网页,那么既可以通
过有线网卡的地址访问当前服务。也可以通过无线网卡访问到当前服务。绑定TCP的
80端口,tcp的80端口被默认规定为HTTP服务使用,也就是我们说的网页服务使用
现在浏览器可以连接到我们绑定的服务地址(“0.0.0.0”,80)来请求网页服务了。
服务器端通过accept()等待客户端连接。

2.解析请求
    浏览器在在请求网页服务的时候会先发送:请求头。什么是请求头呢?相当于告
诉服务器。我要访问你的哪个网页内容,我使用的HTTP版本是什么,等一系列参数信
息。通常我们规定浏览器发送的请求头中第一行需要说明请求方式,请求内容和协议
版本。结构如下:
请求方式   请求内容      协议版本。
GET      /index.html   HTTP/1.0
	#说明浏览器要通过GET方法下载当前目录下名为index.html的文件内容,使用
的HTTP版本为1.0。
	接着还需要告诉服务器我的客户端信息
	User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0
	#告诉服务器是我是用的是win10 64位的电脑的火狐浏览器。
	最后我们还要求请求头中各行内容通过  \r\n 结尾,请求头结尾需要多加一对
\r\n表示请求头的结束。一个简单的请求头大致如下:
	GET /index.html  HTTP/1.0\r\n
	User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n
	

3.响应请求
    记然解析出来浏览器想要获取的网页。那就是要回应客户端请求,直接回应吗?
NO,我们还需要在回应内容的前面加上响应头。相应头。用户告诉浏览器如何解析服
务器回应的内容,和一些服务器信息。其中有一些信息是相对重要的。
	首先我们要求详细头的第一行应该包含服务器使用的HTTP版本和应答代码。例如
	HTTP/1.1 200 OK
	# HTTP/1.1表示服务器使用HTTP协议,版本为1.1 , 200 OK 表示浏览器请
求网页正常,当然还有与之对应的请求错误:404 Not Fount 表示浏览器请求的网
页不存在。
	接着我们要求响应头中还需要出现响应内容的类型。
	Content-Type: Text/html;charset=utf-8
	# text/html 表示传送的HTML文本。charset=utf-8表示使用的编码为utf-8
	最后我们还要求响应头中各行内容通过  \r\n 结尾,响应头结尾需要多加一对
\r\n表示响应头的结束。一个简单的响应头大致如下:
   	HTTP/1.1 200 OK\r\n
   	Content-Type: text/html;charset=utf-8\r\n\r\n
  
 4.切断连接
 	在所有响应信息传送完成后,服务器需要切断和客户端之间的网页连接,表示传送完成
服务器端使用client.close(),切断客户端连接。

代码示例

话不多说,代码走起

# -*- coding:utf-8 -*-
#作者:猫先生的早茶
#时间:2019年6月24日


#----------------------#
#-------导入模块--------#
import socket
import threading
#----------------------#
#----------------------#






#----------------------#
#-------前提参数--------#

#用于设置服务器绑定的地址
server_add = ("0.0.0.0",80)

#用于创建服务器对象
server = socket.socket()

#将服务器绑定到指定的地址上
server.bind(server_add)

#用于设置最大能同时连接100个客户端
server.listen(100)

#设置缓存大小
buffer = 4096

#设置使用的编码为utf-8
code = "utf-8"

#设置响应头
response_header = "HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8\r\n\r\n"

#设置响应的内容
response_html =  "恭喜您访问成功"    
#----------------------#
#----------------------#


#----------------------#
#-------代码主体--------#
def response(client):
    #将网页内容发送给浏览器
    client.send((response_header+response_html).encode(code))

    #切断和浏览器的连接
    client.close()


while True:
    #等待浏览连接
    client,addr = server.accept()
    #给浏览器响应内容
    response(client)
#----------------------#
#----------------------#   

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43017750/article/details/93477428

智能推荐

CSDN日报19228——这4点微不足道的改变,正在带我起飞_csdn博客-程序员宅基地

文章浏览阅读2.8k次。程序人生 | 这4点微不足道的改变,正在带我起飞作者:沉默王二3个月前,我完全不懂什么叫个人品牌。我在CSDN上纯粹是为了写而写,完全不知道文章的作者——“沉默王二”就是我的个人品牌,就是我以后可以靠它生存的金字招牌。我在2015年就成为CSDN的博客专家了,排名达到1107,但竟然籍籍无名,除了七八个出版社的编辑找我写书外,再没有别的资源链接到我——“变现”和我之间隔着一条难以逾越的“..._csdn博客

白色简洁的瑞班克个人博客网站-程序员宅基地

文章浏览阅读101次。链接:http://pan.baidu.com/s/1eSqSY8E密码:yqaf转载于:https://www.cnblogs.com/wordblog/p/6804750.html_白色博客网站

java-poi实现:合并汇总不同ecxel的同名sheet页数据_java 对excel 数据汇总-程序员宅基地

文章浏览阅读705次。java-poi、excel操作_java 对excel 数据汇总

C++ LeetCode 171 EXCEL表列序号_计算excel的列序号c++-程序员宅基地

文章浏览阅读152次。给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1:输入: “A”输出: 1示例 2:输入: “AB”输出: 28示例 3:输入: “ZY”输出: 701其实就是26进制转10进制class Solution {public: int titleToNumber(string s) { int_计算excel的列序号c++

[Erlang 0052] Erlang otp_src_R15B01 Released_otp_src_r15b01.tar.gz-程序员宅基地

文章浏览阅读729次。Bug fix release : otp_src_R15B01Build date : 2012-04-02This is R15B01, the first maintenance release for the R15B major release.You can find the README file for the release at http_otp_src_r15b01.tar.gz

Python 基础系列 5 - Set 去重原理_python set 底层如何去掉重复元素原理 数组去重-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏3次。在上篇文章《[哈希值和可变性Hash value and mutability](https://blog.csdn.net/wumingxiaoyao/article/details/108912543)》最后说到 set 去重问题,所以这篇主要是通过实践来研究一下 set 去重背后的故事,当然也是参考了网上一些资料得到了一些启发,感谢那些陌生的喜欢分享的博友们。想了解更多 Python 基础序列文章,请参考 [Python 基础系列大纲](https://blog.csdn.net/wumingxia_python set 底层如何去掉重复元素原理 数组去重

随便推点

使用matlab绘制世界地图并根据经纬度绘制点位(附m_map的下载与安装说明)_matlab根据经纬度画地图-程序员宅基地

文章浏览阅读6.8w次,点赞74次,收藏410次。使用matlab绘制世界地图有两种方法(自己使用过的,可能有别的我不了解的方法):第一种是worldmap和geoshow;第二种是利用m_map工具箱;下面分别介绍这两种方法。1.worldmap & geoshowworldmap和geoshow是matlab中绘图工具箱的两个绘图函数,直接调用即可。worldmap的语法:worldmap region %r..._matlab根据经纬度画地图

使用summary时遇到AttributeError: ‘list‘ object has no attribute ‘size‘的错误_list' object has no attribute 'size-程序员宅基地

文章浏览阅读5.5k次。出现改错时,意思就是本来因该是tensor的地方你写的是list,所以出现了这个错误。对我个人而言,我的错误出现在模型的forword函数中,我的模型有多个输入,而我是以list的形式传入了多个输入,即将多个输入作为了一个整体传给了模型。而在summary中会计算模型的输入形状,即其会使用到输入的.size属性,而当我传入的是list时,由于list没有.size属性,所以报了这个错。正确的的做法是将这多个输入作为多个tensor分开传入,而不是作为一个list整体。如下: def forward_list' object has no attribute 'size

新年第一天 | 恶补新一季《黑镜》的同时,营长又深入扒了扒它那擅长机器学习的新爸爸是如何赚钱的-程序员宅基地

文章浏览阅读4.3k次。关注『AI科技大本营』的各位小伙伴,新年好!营长祝愿大家天天都是18岁!跟放假休息的各位一样,元旦假期的营长着实也不想干活……想起前两天刚刚更新的《黑镜》第四季还没有跟,营长便决定在新年的第一天恶补一下科技和AI的黑暗面。第1集,《联邦星舰卡利斯特号》:“柯克船长”——咳,一直被老板和同事精神虐待的游戏公司老码农,却拥有一台能通过DNA来复制意识的机器,于是老码农变身猥琐男,把老板和同事的意识上传_黑镜鳄鱼的眼泪

杰里之双麦降噪原理篇_双麦克风降噪原理-程序员宅基地

文章浏览阅读3.4k次。耳机有两颗麦克风,一颗在顶部,一颗在末端底部,顶部的用来拾取环境噪音,底部的用来拾取通话。在嘈杂的环境中,两颗麦克风拾取的噪音将会反向叠加用来抵消噪音降噪。实际通话过程中,确实非常有效,官方给出的数据是时速30公里/小时的风噪可正常通话,可见其实力非凡。..._双麦克风降噪原理

NGINX的重写与反向代理机制解析_nginx set指令-程序员宅基地

文章浏览阅读1.3k次,点赞35次,收藏26次。在现代Web架构中,NGINX以其高性能、稳定性和灵活性而广受青睐。本文将深入探讨NGINX中的两个核心功能:URL重写和反向代理,以帮助您更好地理解和配置这些强大的特性。_nginx set指令

HTTP1.0、HTTP2.0、HTTP 3.0及HTTPS简要介绍-程序员宅基地

文章浏览阅读2.3w次,点赞27次,收藏138次。HTTP1.0、HTTP2.0、HTTP 3.0及HTTPS简要介绍1 HTTP1.0及HTTPSHTTP 建立之初,是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。但随着CSS,Javascript的出现,以及移动互联时代的到来,我们不得不对HTTP进行不断地优化。HTTP优化:影响一个 HTTP 网络请求的因素主要有两个方面:带宽和延迟。随着网络基础建设的完善,带宽因素已经不需要再考虑,仅需要考虑的就是延迟。延迟主要受三个方面影响:浏览器阻塞(HOL blocking_http1.0

推荐文章

热门文章

相关标签