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. MySQL学习(四)查询

    一.group_concat()函数.把groupby的分组中字段数据组合显示出来 select s_id , GROUP_CONCAT(要显示的字段名)  from table group by 分 ...

  2. python nmap模块 端口探测

    今天添加端口探测功能,主要实现方式是通过nmap模块调用,扫描1-65535端口.上一篇中已经将UP的PC机全部获取到,这里直接从已知在线的PC中进行端口扫描就可以了,会节省很多时间. 代码如下,还是 ...

  3. 对selenium自动化框架重构

    近期在编写自动化脚本的时候发现以前写的部分不是特别友好,在此进行重构.废话不说 搭建自动化框架,首先先理清思路: 使用的技术python+unittest+selenium+excel 文件目录有: ...

  4. maven项目 servlet jar包冲突

    Failed to process JAR found at URL  for ServletContainerInitializers for context with name [{1}] 启动报 ...

  5. watch、computed、methods的区别

    1. `computed`属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.主要当作属性来使用,要return出去一个值:2. `methods`方法表示一个具体的操作,主要书写业务逻辑:3. ...

  6. 轻量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 语句

    *本文中所用类声明见上一篇博文<轻量ORM-SqlRepoEx (三)Select语句>中Customers类 一.增加记录 1.工厂一个实例仓储 var repository = Rep ...

  7. 菜鸟笔记 -- Chapter 6.2.5 代码块

    6.2.5  代码块 在编程过程中我们通常会遇到如下这种形式的程序: package democlass; public class CodeBlock { { System.out.println( ...

  8. 使用xlsx把json对象导出excel

    1,首先使用npm下载xlsx.执行命令 npm install xlsx --save import { Component, OnInit } from '@angular/core'; //im ...

  9. Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法

    在安装 win10的时候,会出现这种提示:Windows 无法安装到这个磁盘.选中的磁 盘具有 MBR 分区表.在 EFI 系统上, Windows 只能安装到 GPT 磁盘.出现这种 情况主要是因为 ...

  10. WKWebView进度及title

    WKWebView进度及title WKWebView进度及title WKWebView 的estimatedProgress和title 都是KVO模式,所以可以添加监控: [webView ad ...