1.换行符

    

2.pycharm 连接Ubuntu

  1)添加环境变量

  2)查看ip

  3)配置目录

  4)上传或者下载

3.面向对象抽象web服务器

  1)版本1:类

class HttpServer(object):
""""""
pass http_server = HttpServer()

  2)版本2:初始化

class HttpServer(object):
""""""
def __init__(self,port):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("",port ))
self.server_socket.listen(128) http_server = HttpServer(8080)

  3)版本3:定义方法

class HttpServer(object):
""""""
def __init__(self,port):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("", port))
self.server_socket.listen(128) def start(self):
pass def hand_client(self):
pass http_server = HttpServer(8080)
http_server.start()

  4)版本4:调整

#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 class HttpServer(object):
""""""
def __init__(self,port):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("", port)) def start(self):
self.server_socket.listen(128)
while True:
client_socket, client_address = self.server_socket.accept() # 赋值的时候有空格
print("[%s,%s]用户连接上了" % client_address)
hand_client_process = Process(target=self.hand_client, args=(client_socket,))
# =函数名 不能有空格
hand_client_process.start()
client_socket.close() # 多进程会复制 client_socket def hand_client(self,client_socket):
"""处理客户端请求""" # 推荐""""""
# 获取客户端请求数据
request_data = client_socket.recv(1024)
print("request_data:", request_data)
request_data = request_data.decode("utf-8")
request_lines = request_data.splitlines()
print(request_lines) # 解析请求报文
for line in request_lines:
print(line)
# GET /favicon.ico HTTP/1.1
request_start_line = request_lines[0]
# 提取用户请求的文件名
file_name = re.match(r"\w+ +(/[^ ]*)", request_start_line).group(1)
print(file_name) if "/" == file_name: # 常量放在等号的左边
file_name = "/index.html" # 打开文件读取内容
try:
file = open(HTML_ROOT_DIR + file_name, "rb")
except IOError:
response_start_line = "HTTP/1.1 404 Not found \r\n"
response_headers = "Server: My server\r\n"
response_body = "the file is not found"
else:
file_data = file.read()
file.close() # 构造响应数据 # 空一格在加注释
response_start_line = "HTTP/1.1 200 OK \r\n"
response_headers = "Server: My server\r\n"
response_body = file_data.decode("utf-8") response = response_start_line + response_headers + "\r\n" + response_body
print("response:", response) # 向客户端返回相应数据
client_socket.send(bytes(response, "utf-8")) # 关闭客户端连接
client_socket.close() def main():
http_server = HttpServer(8080)
http_server.start() if __name__ == "__main__":
main()

  5)版本5:增加bind方法

#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 class HttpServer(object):
""""""
def __init__(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) def start(self):
self.server_socket.listen(128)
while True:
client_socket, client_address = self.server_socket.accept() # 赋值的时候有空格
print("[%s,%s]用户连接上了" % client_address)
hand_client_process = Process(target=self.hand_client, args=(client_socket,))
# =函数名 不能有空格
hand_client_process.start()
client_socket.close() # 多进程会复制 client_socket def hand_client(self,client_socket):
"""处理客户端请求""" # 推荐""""""
# 获取客户端请求数据
request_data = client_socket.recv(1024)
print("request_data:", request_data)
request_data = request_data.decode("utf-8")
request_lines = request_data.splitlines()
print(request_lines) # 解析请求报文
for line in request_lines:
print(line)
# GET /favicon.ico HTTP/1.1
request_start_line = request_lines[0]
# 提取用户请求的文件名
file_name = re.match(r"\w+ +(/[^ ]*)", request_start_line).group(1)
print(file_name) if "/" == file_name: # 常量放在等号的左边
file_name = "/index.html" # 打开文件读取内容
try:
file = open(HTML_ROOT_DIR + file_name, "rb")
except IOError:
response_start_line = "HTTP/1.1 404 Not found \r\n"
response_headers = "Server: My server\r\n"
response_body = "the file is not found"
else:
file_data = file.read()
file.close() # 构造响应数据 # 空一格在加注释
response_start_line = "HTTP/1.1 200 OK \r\n"
response_headers = "Server: My server\r\n"
response_body = file_data.decode("utf-8") response = response_start_line + response_headers + "\r\n" + response_body
print("response:", response) # 向客户端返回相应数据
client_socket.send(bytes(response, "utf-8")) # 关闭客户端连接
client_socket.close() def bind(self,port):
self.server_socket.bind(("", port)) def main():
http_server = HttpServer()
http_server.bind(8080)
http_server.start() if __name__ == "__main__":
main()

4 class类 web服务器的更多相关文章

  1. 一个C#的与web服务器交互的HttpClient类

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Net ...

  2. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  3. 一不小心写了个WEB服务器

    开场 Web服务器是啥玩意? 是那个托管了我的网站的机器么? No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具,没 ...

  4. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

  5. 自己实现一个简易web服务器

    一个web服务器是网络应用中最基础的环节. 构建需要理解三个内容: 1.http协议 2.socket类 3.服务端实现原理 1.1 HTTP http请求 一般一个http请求包括以下三个部分: 1 ...

  6. 关于Web服务器的认识

    马上就要毕业了,也要开始找工作了,大学写了这么多代码了,却没有好好总结一下常用的概念很是遗憾额,就通过这篇博客记录一下我最常用的一些知识好了. 说到Web服务器,有很多文章都介绍的很好,之前看到一篇非 ...

  7. 【WEB】一个简单的WEB服务器

    WEB 服务器如何工作的?   HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从H ...

  8. 基于OWin的Web服务器Katana发布版本3

    当 ASP.NET 首次在 2002 年发布时,时代有所不同. 那时,Internet 仍处于起步阶段,大约有 5.69 亿用户,每个用户平均每天访问 Internet 的时间为 46 分钟,大约有 ...

  9. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

随机推荐

  1. 描边时消除锯齿SetSmoothingMode

    SmoothingModeAntiAlias 指定消除锯齿的呈现. SmoothingModeDefault 指定默认模式. SmoothingModeHighQuality 指定高质量.低速度呈现. ...

  2. 如何使用Putty登录安装在VirtualBox里的ubuntu

    我是在Windows操作系统里用VirtualBox安装了ubuntu操作系统. 在VirtualBox里操作ubuntu的终端不是很方便,比如我想在Windows里复制一些命令到ubuntu的终端执 ...

  3. Django:模板系统

    一,常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二,常量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊 ...

  4. 2018.12.19 Struts2 框架总复习

    总结Struts2 框架 struts2技术的优势 项目开源,使用及拓展方便 提供Exception处理机制 Result方式的页面导航,通过Result标签很方便的实现重定向和页面跳转 通过简单.集 ...

  5. Latex 编辑器安装

    MiKTex + TexStudio 1. 下载安装MiKTex,从http://www.miktex.org/下载basic-miktex-2.9.5872-x64.exe,一路默认安装... 或者 ...

  6. axios简单了解

    简单介绍 axios是基于客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  7. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  8. Oracle数据库中游标的游标的使用

    本人不喜欢说概念啥的,就直接说明使用方法吧 案例1: DECALRE --声明游标 CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE ...

  9. linux 中$ 意思

    grep -n sh$ text.txt   查找文件内容中以 Sh 结尾. grep -n ^a text.txt    文件文件内容中以 a 开头. grep -n ^$ text.txt     ...

  10. iOS之出现( linker command failed with exit code 1)错误总结

    本文出自:http://blog.csdn.NET/hengshujiyi/article/details/21182813 补充:我出现这个错误是一个工程中有两个同名的文件,只要删除掉一个就好了,可 ...