1.处理客户端请求数据

>>> s = "GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive"
>>> s.splitlines()
['GET / HTTP/1.1', 'Host: 127.0.0.1:8080', 'Connection: keep-alive']
#-*- coding:utf-8 -*-
import socket
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 #函数上面有空行2行
def hand_client(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) # 构造响应数据 # 空一格在加注释
response_start_line = "HTTP/1.1 200 OK \r\n"
response_headers = "Server: My server\r\n"
response_body = "hello world"
response = response_start_line + response_headers + "\r\n" +response_body
print("response:",response) # 向客户端返回相应数据
client_socket.send(bytes(response,"utf-8")) # 关闭客户端连接
client_socket.close() if __name__ == "__main__":
#AF_INET 是个常量
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",8080))
server_socket.listen(128) while True:
client_socket, client_address = server_socket.accept() #赋值的时候有空格
print("[%s,%s]用户连接上了"%client_address)
hand_client_process = Process(target=hand_client,args=(client_socket,))
#=函数名 不能有空格
hand_client_process.start()
client_socket.close() #多进程会复制 client_socket

2.正则匹配

>>> s
'GET /favicon.ico HTTP/1.1'
>>> re.match(r"\w+ +(/[^ ]*)",s).group(1)
'/favicon.ico'
#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 #函数上面有空行2行
def hand_client(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) # 构造响应数据 # 空一格在加注释
response_start_line = "HTTP/1.1 200 OK \r\n"
response_headers = "Server: My server\r\n"
response_body = "hello world"
response = response_start_line + response_headers + "\r\n" +response_body
print("response:",response) # 向客户端返回相应数据
client_socket.send(bytes(response,"utf-8")) # 关闭客户端连接
client_socket.close() if __name__ == "__main__":
#AF_INET 是个常量
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",8080))
server_socket.listen(128) while True:
client_socket, client_address = server_socket.accept() #赋值的时候有空格
print("[%s,%s]用户连接上了"%client_address)
hand_client_process = Process(target=hand_client,args=(client_socket,))
#=函数名 不能有空格
hand_client_process.start()
client_socket.close() #多进程会复制 client_socket

3. 打开文件读取内容,抛出异常

#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 #函数上面有空行2行
def hand_client(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) # 打开文件读取内容
file = open(HTML_ROOT_DIR + file_name,"rb")
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
response = response_start_line + response_headers + "\r\n" + response_body
print("response:",response) # 向客户端返回相应数据
client_socket.send(bytes(response,"utf-8")) # 关闭客户端连接
client_socket.close() if __name__ == "__main__":
#AF_INET 是个常量
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",8080))
server_socket.listen(128) while True:
client_socket, client_address = server_socket.accept() #赋值的时候有空格
print("[%s,%s]用户连接上了"%client_address)
hand_client_process = Process(target=hand_client,args=(client_socket,))
#=函数名 不能有空格
hand_client_process.start()
client_socket.close() #多进程会复制 client_socket

4.抛出文件异常,修改字符编码

  • 重用端口
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 修改参数 #级别 socket #重用地址 #1
#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 #函数上面有空行2行
def hand_client(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) # 打开文件读取内容
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() if __name__ == "__main__":
#AF_INET 是个常量
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("",8080))
server_socket.listen(128) while True:
client_socket, client_address = server_socket.accept() #赋值的时候有空格
print("[%s,%s]用户连接上了"%client_address)
hand_client_process = Process(target=hand_client,args=(client_socket,))
#=函数名 不能有空格
hand_client_process.start()
client_socket.close() #多进程会复制 client_socket

    

5.主页优化

    if  "/" == file_name :  # 常量放在等号的左边
file_name = "/index.html"

6.完整版

#-*- coding:utf-8 -*-
import socket
import re
#空行
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" #常量全部要大写 #函数上面有空行2行
def hand_client(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() if __name__ == "__main__":
#AF_INET 是个常量
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("",8080))
server_socket.listen(128) while True:
client_socket, client_address = server_socket.accept() #赋值的时候有空格
print("[%s,%s]用户连接上了"%client_address)
hand_client_process = Process(target=hand_client,args=(client_socket,))
#=函数名 不能有空格
hand_client_process.start()
client_socket.close() #多进程会复制 client_socket

3 web服务器:静态文件的更多相关文章

  1. linux web服务器静态资源的处理 unison+inotify双向同步

    linux web服务器静态资源的处理 unison+inotify双向同步 http://monkeyzhu.blog.51cto.com/5764358/1324391 简介 unison可以使两 ...

  2. TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理

    目录 1. C# Socket通讯 2. HTTP 解析引擎 3. 资源读取和返回 4. 服务器测试和代码下载 Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回 ...

  3. [js高手之路]node js系列课程-创建简易web服务器与文件读写

    web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...

  4. Web服务器实现文件传输程序设计

    总体概括来说就是设计一个Web服务器的流程,将执行流程分为简单的步骤,每个步骤作为一个模块来实现. 1.整体设计 服务器程序发送文件给客户端或者从客户端接收文件,每次通信只能做一次文件传输,传输完毕后 ...

  5. Nginx(四):http服务器静态文件查找的实现

    上一篇nginx的文章中,我们理解了整个http正向代理的运行流程原理,主要就是事件机制接入,header解析,body解析,然后遍历各种checker,直到处理成功为止. 我们以访问一个普通文件为例 ...

  6. Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]

    遇到的问题: 1.java.io.IOException: open failed: EINVAL (Invalid argument)异常,在模拟器中的sd卡创建文件夹和文件时报错 出错原因可能是: ...

  7. 用IdHTTPServer搞个简单的WEB服务器下载文件

    放在公司共享盘中的文件,不时就被其他人剪切走了,本想用Apache搭个服务端,提供文件下载的功能,写php脚本时碰到点问题,没折腾出来,一狠心,用Indy的IdHttpServer写.不过中间也碰到了 ...

  8. Nginx配置服务器静态文件支持跨域访问

    在server中配置 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Reque ...

  9. 使用nginx缓存服务器上的静态文件

    一.nginx缓存的优点 如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力. 因为静态文件(比如css,js, 图片)中,很多都是不经常更新的.nginx使用proxy_cach ...

  10. NodeJs+http+fs+request+cheerio 采集,保存数据,并在网页上展示(构建web服务器)

    目的: 数据采集 写入本地文件备份 构建web服务器 将文件读取到网页中进行展示 目录结构: package.json文件中的内容与上一篇一样:NodeJs+Request+Cheerio 采集数据 ...

随机推荐

  1. libxml2用xpath进行查找

    xml文档 <?xml version="1.0" encoding="UTF-8"?> <radios> <radio> ...

  2. MySQL学习(三)函数

    一.数学函数 绝对值函数ABS():ABS(X) 返回圆周率函数PI() 平方根函数SQRT() 求余函数MOD(X,Y) 获取整数函数CEIL(X),CEILING(X)返回不小于X的最小整数:FL ...

  3. iOS UI(布局)约束是什么?view1.attr1 = view2.attr2 * multiplier + constant

    /* Create constraints explicitly.  Constraints are of the form "view1.attr1 = view2.attr2 * mul ...

  4. 模拟,找次品硬币,Counterfeit Dollar(POJ 1013)

    题目链接:http://poj.org/problem?id=1013 解题报告: 1.由于次品的重量不清楚,用time['L'+1]来记录各个字母被怀疑的次数.为负数则轻,为正数则重. 2.用zer ...

  5. 使用MSF生成木马_入侵Windows

    1>生成木马 (123.exe)        -f 输出格式 -o 输出地址 2>启动msfconsole 3>进行设置&&启动攻击 4>木马运行&后 ...

  6. LocalDB的奇怪问题

    属性 MasterDBPath 不可用于 信息“Microsoft.SqlServer.Management.Smo.Information”.该对象可能没有此属性,也可能是访问权限不足而无法检索. ...

  7. Hive UDF 用户自定义函数 编程及使用

    首先创建工程编写UDF 代码,示例如下: 1. 新建Maven项目 udf 本机Hadoop版本为2.7.7, Hive版本为1.2.2,所以选择对应版本的jar ,其它版本也不影响编译. 2. po ...

  8. WebStorm11 注册码及激活

    网址:http://www.jianshu.com/p/5ce394a28ce5 1.获取注册码 打开第一个网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成 ...

  9. linux学习(一)开始

    第一关 用u盘安装ubuntu, 大部份工作制作的安装U盘会失败,使用Win32DiskImager就行了,这个工具需要手动填写完整iso路径. 第二个问题 装完后发现乱码,连英文都乱码,不知道原因, ...

  10. JavaEE权限管理系统的搭建(七)--------管理用户的增删改

    本小结讲解管理用户的增删改查实现, 首先是添加用户,如下图所示,可以看到添加用户的同时也要给用户分配角色,至少给用户分配一个或者是多个角色 页面js部分: $.ajax({ //几个参数需要注意一下 ...