IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> python高级学习笔记Day02--python静态Web服务器的搭建 -> 正文阅读

[系统运维]python高级学习笔记Day02--python静态Web服务器的搭建

开发自己静态Web服务器

pycharm打开包含服务器资源(html文件,图片资源等)的文件夹,创建新py文件

代码如下:

?import socket

if __name__ == '__main__':
? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
? ? tcp_server_socket.bind(('', 8080))
? ? tcp_server_socket.listen(128)
? ? while True:
? ? ? ? client_socket, client_ip = tcp_server_socket.accept()
? ? ? ? client_request_data = client_socket.recv(1024).decode()
? ? ? ? print(client_request_data)
? ? ? ? with open('./index.html', 'rb') as fp:
? ? ? ? ? ? file_data = fp.read()
? ? ? ? response_line = 'HTTP/1.1 200 OK \r\n'
? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? response_body = file_data
? ? ? ? response_data = (response_line + response_header + '\r\n').encode() + response_body
? ? ? ? client_socket.send(response_data)
? ? ? ? client_socket.close()

静态Web服务器升级版本(多任务,解决访问文件不存在等报错问题)

import socket
import threading


def handle_client(client_socket):
? ? client_request_data = client_socket.recv(1024).decode()
? ? if len(client_request_data)==1:
? ? ? ? client_socket.close
? ? ? ? return
? ? requestspath = client_request_data.split(' ')[1]
? ? if requestspath == '/':
? ? ? ? requestspath = '/index.html'
? ? try:
? ? ? ? with open('.' + requestspath, 'rb') as fp:
? ? ? ? ? ? file_data = fp.read()
? ? except Exception as e:
? ? ? ? response_line = 'HTTP/1.1 404 Not Found \r\n'
? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? response_body = "404 Not Found"
? ? ? ? response_data = (response_line + response_header + '\r\n' + response_body).encode()
? ? ? ? client_socket.send(response_data)
? ? else:
? ? ? ? response_line = 'HTTP/1.1 200 OK \r\n'
? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? response_body = file_data
? ? ? ? response_data = (response_line + response_header + '\r\n').encode() + response_body
? ? ? ? client_socket.send(response_data)
? ? finally:
? ? ? ? client_socket.close()


if __name__ == '__main__':
? ? tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
? ? tcp_server_socket.bind(('', 8080))
? ? tcp_server_socket.listen(128)
? ? while True:
? ? ? ? client_socket, client_ip = tcp_server_socket.accept()
? ? ? ? client_thread = threading.Thread(target=handle_client, args=(client_socket,))
? ? ? ? client_thread.start()

面向对象版本(方便代码复用)

import socket
import threading


class HttpWebServer:
? ? def __init__(self):
? ? ? ? self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? ? ? self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
? ? ? ? self.tcp_server_socket.bind(('', 8080))
? ? ? ? self.tcp_server_socket.listen(128)

? ? def handle_client(self, client_socket):
? ? ? ? client_request_data = client_socket.recv(1024).decode()
? ? ? ? request_data = client_request_data.split(' ')

? ? ? ? if len(request_data) == 1:
? ? ? ? ? ? client_socket.close
? ? ? ? ? ? return
? ? ? ? requestspath = request_data[1]
? ? ? ? if requestspath == '/':
? ? ? ? ? ? requestspath = '/index.html'
? ? ? ? try:
? ? ? ? ? ? with open('.' + requestspath, 'rb') as fp:
? ? ? ? ? ? ? ? file_data = fp.read()
? ? ? ? except Exception as e:
? ? ? ? ? ? response_line = 'HTTP/1.1 404 Not Found \r\n'
? ? ? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? ? ? response_body = "404 Not Found"
? ? ? ? ? ? response_data = (response_line + response_header + '\r\n' + response_body).encode()
? ? ? ? ? ? client_socket.send(response_data)

? ? ? ? else:
? ? ? ? ? ? response_line = 'HTTP/1.1 200 OK \r\n'
? ? ? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? ? ? response_body = file_data
? ? ? ? ? ? response_data = (response_line + response_header + '\r\n').encode() + response_body
? ? ? ? ? ? client_socket.send(response_data)
? ? ? ? finally:
? ? ? ? ? ? client_socket.close()

? ? def start(self):
? ? ? ? while True:
? ? ? ? ? ? client_socket, client_ip = self.tcp_server_socket.accept()
? ? ? ? ? ? client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))
? ? ? ? ? ? client_thread.start()


if __name__ == '__main__':
? ? my_web_server = HttpWebServer()
? ? my_web_server.start()

命令行启动动态绑定端口号(最终版)

在文件中引入sys模块用来获取命令行输入内容,在代码中输出sys.argv即可看到如下结果

?在代码中对获取到的argv[1]即输入的端口号进行验证,然后传入方法中,错误则发出提示,结果如下

现在就可以在命令行启动服务器并指定端口号了!!!!

?代码如下:

import socket
import threading
import sys


class HttpWebServer:
? ? def __init__(self, port):
? ? ? ? self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? ? ? self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
? ? ? ? self.tcp_server_socket.bind(('', port))
? ? ? ? self.tcp_server_socket.listen(128)

? ? def handle_client(self, client_socket):
? ? ? ? client_request_data = client_socket.recv(1024).decode()
? ? ? ? request_data = client_request_data.split(' ')

? ? ? ? if len(request_data) == 1:
? ? ? ? ? ? client_socket.close
? ? ? ? ? ? return
? ? ? ? requestspath = request_data[1]
? ? ? ? if requestspath == '/':
? ? ? ? ? ? requestspath = '/index.html'
? ? ? ? try:
? ? ? ? ? ? with open('.' + requestspath, 'rb') as fp:
? ? ? ? ? ? ? ? file_data = fp.read()
? ? ? ? except Exception as e:
? ? ? ? ? ? response_line = 'HTTP/1.1 404 Not Found \r\n'
? ? ? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? ? ? response_body = "404 Not Found"
? ? ? ? ? ? response_data = (response_line + response_header + '\r\n' + response_body).encode()
? ? ? ? ? ? client_socket.send(response_data)

? ? ? ? else:
? ? ? ? ? ? response_line = 'HTTP/1.1 200 OK \r\n'
? ? ? ? ? ? response_header = 'Server:pwb\r\n'
? ? ? ? ? ? response_body = file_data
? ? ? ? ? ? response_data = (response_line + response_header + '\r\n').encode() + response_body
? ? ? ? ? ? client_socket.send(response_data)
? ? ? ? finally:
? ? ? ? ? ? client_socket.close()

? ? def start(self):
? ? ? ? while True:
? ? ? ? ? ? client_socket, client_ip = self.tcp_server_socket.accept()
? ? ? ? ? ? client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))
? ? ? ? ? ? client_thread.start()


def main():
? ? print(sys.argv)
? ? if len(sys.argv) != 2:
? ? ? ? print("Input Error:Should be python3 xxx.py port")
? ? ? ? return
? ? if not sys.argv[1].isdigit():
? ? ? ? print("Input Error:Should be python3 xxx.py port")
? ? ? ? return
? ? port = int(sys.argv[1])
? ? my_web_server = HttpWebServer(port)
? ? my_web_server.start()


if __name__ == '__main__':
? ? main()
?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:28:27  更:2022-02-03 01:29:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 7:55:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码