使用python实现http服务器
2024-10-21 22:58:36
主要使用python实现了一个http服务器。http服务器实现了用户的注册和登录的简单功能,当然还可以继续扩展。
数据的存储使用的是文件,有兴趣的话可以使用数据库进行存储。当然根据个人兴趣而定。
本记录主要是为了自己后面进行查阅,并给有需要的人提供方便,抛砖引玉。如果浪费了大家的时间也请多多关照。
- 进程启动代码
from ChttpServer import CHttpServer
def main():
http_server = CHttpServer.CHttpServer()
http_server.bind(8000)
http_server.start() if __name__ == "__main__":
main()
2.http服务器实现类
import socket
import sys
import re
from multiprocessing import Process
class CHttpServer(object):
"""Httpserver服务端类"""
def __init__(self):
self.m_serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.m_serverSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
def start(self):
self.m_serverSocket.listen(128)
while(True):
m_clientSocket,m_clientAddr = self.m_serverSocket.accept()
print('[%s,%s]用户连接上了服务器' % m_clientAddr)
handle_client_process = Process(target = self.handle_client,args=(m_clientSocket,))
handle_client_process.start()
m_clientSocket.close()
#数据处理进程
def handle_client(self,clientSocket):
'''
处理客户请求操作
'''
#获取客户请求数据
request_data = clientSocket.recv(1024)
#print('接收到的数据:%s' % request_data)
request_lines=request_data.splitlines()
#print(len(request_lines))
strlist=[]
for line in request_lines:
strlist=str(line).split('&')
if len(strlist) > 1:
break
#print(strlist[1:5])
userinfolist = strlist[1:3]
user_info='&'.join(userinfolist)
#print(userinfolist)
#用户名&密码&操作类型&来源
#解析请求报文
'''
报文协议格式:clientparam=&username&pwd&method&type&.
type:0 注册 1登录
'''
file_data=''
response_body=''
response=''
response_start_line = "HTTP/1.1 200 OK\r\n"
response_headers = "Server: My server\r\n"
if strlist[3]=='':#注册
"""写注册文件"""
fp = open('userinfo.txt','a+') fp.write(user_info)
fp.write('\n')
fp.close()
file_data=r'<b>恭喜您,注册成功:'+ (strlist[1]+'</b>')
response_body = file_data
response = response_start_line + response_headers + "\r\n" + response_body
elif strlist[3]=='': #登录
"""登录系统"""
fp = open('userinfo.txt','r')
for line in fp.readlines():
if line.replace('\n','') == user_info.replace('\n',''):
#print(user_info)
file_data=r'<b>恭喜您,登录成功:'+ (strlist[1]+'</b>')
response_body = file_data
response = response_start_line + response_headers + "\r\n" + response_body
break
# 向客户端返回 响应数据
fp.close()
elif strlist[3]=='': #重置密码
pass
else:
file_data=r'非法操作'
response_body = file_data
response = response_start_line + response_headers + "\r\n" + response_body
print('发送的数据[%s]' % response)
clientSocket.send(bytes(response, "gbk"))
#组装返回包
def start_response(self,status,headers):
response_headers = "HTTP/1.1 " + status + "\r\n"
for header in headers:
response_headers += "%s: %s\r\n" % header
self.response_headers = response_headers
#绑定端口
def bind(self,port):
self.m_serverSocket.bind(('',port))
def parseline(self,strcon):
"""解析字符串"""
pass
3、运行情况
测试命令:http://127.0.0.1:8000/&jifei&123456&2&0&
最新文章
- php递归遍历目录计算其大小(文件包括目录和普通文件)
- 从数学角度看最大期望(EM)算法 I
- 内存泄漏,当您使用的 GetDC 方法和 ReleaseDC 方法 CWnd 类版本
- tomcat学习笔记1
- iOS 中UIButton的 settitle 和 titlelabel的使用误区
- BootStrap2学习日记18---提示消息
- How to Change Password Complexity Requirements in Windows XP
- DateBox( 日期输入框) 组件
- Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
- MySQLHA系列MHA(一)
- nodejs显现events.js:72抛出错误
- 无法将类型为excel.applicationclass的com 强制转换为接口类型的解决方法[转]
- 记录项目版本升级angular4 ~ angular5
- Java 中的 List —— 有序序列
- Android EditText自定义样式
- Oracle SQL: DDL DML DCL TCL
- 推荐系统resys小组线下活动见闻2009-08-22
- C语言 &#183; 分分钟的碎碎念
- iOS uitextfield长度限制
- svn 常见问题记录