使用python實現http服務器


主要使用python實現了一個http服務器。http服務器實現了用戶的注冊和登錄的簡單功能,當然還可以繼續擴展。

數據的存儲使用的是文件,有興趣的話可以使用數據庫進行存儲。當然根據個人興趣而定。

本記錄主要是為了自己后面進行查閱,並給有需要的人提供方便,拋磚引玉。如果浪費了大家的時間也請多多關照。

  1. 進程啟動代碼
1 from ChttpServer import CHttpServer
2 def main():
3     http_server = CHttpServer.CHttpServer()
4     http_server.bind(8000)
5     http_server.start()
6 
7 if __name__ == "__main__":
8     main()

  2.http服務器實現類

 1 import socket
 2 import sys
 3 import re
 4 from multiprocessing import Process
 5 class CHttpServer(object):
 6     """Httpserver服務端類"""
 7     def __init__(self):
 8         self.m_serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 9         self.m_serverSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
10     def start(self):
11         self.m_serverSocket.listen(128)
12         while(True):
13             m_clientSocket,m_clientAddr = self.m_serverSocket.accept()
14             print('[%s,%s]用戶連接上了服務器' % m_clientAddr)
15             handle_client_process = Process(target = self.handle_client,args=(m_clientSocket,))
16             handle_client_process.start()
17             m_clientSocket.close()
18     #數據處理進程
19     def handle_client(self,clientSocket):
20         '''
21         處理客戶請求操作
22         '''
23         #獲取客戶請求數據
24         request_data = clientSocket.recv(1024)
25         #print('接收到的數據:%s' % request_data)
26         request_lines=request_data.splitlines()
27         #print(len(request_lines))
28         strlist=[]
29         for line in request_lines:
30             strlist=str(line).split('&')
31             if len(strlist) > 1:
32                 break
33         #print(strlist[1:5])
34         userinfolist = strlist[1:3]
35         user_info='&'.join(userinfolist)
36         #print(userinfolist)
37         #用戶名&密碼&操作類型&來源
38         #解析請求報文
39         '''
40         報文協議格式:clientparam=&username&pwd&method&type&.
41         type:0 注冊 1登錄
42         '''
43         file_data=''
44         response_body=''
45         response=''
46         response_start_line = "HTTP/1.1 200 OK\r\n"
47         response_headers = "Server: My server\r\n"
48         if strlist[3]=='1':#注冊
49             """寫注冊文件"""
50             fp = open('userinfo.txt','a+')
51            
52             fp.write(user_info)
53             fp.write('\n')
54             fp.close()
55             file_data=r'<b>恭喜您,注冊成功:'+ (strlist[1]+'</b>')
56             response_body = file_data
57             response = response_start_line + response_headers + "\r\n" + response_body
58         elif strlist[3]=='2': #登錄
59            """登錄系統"""
60            fp = open('userinfo.txt','r')
61            for line in fp.readlines():
62                if line.replace('\n','') == user_info.replace('\n',''):
63                    #print(user_info)
64                    file_data=r'<b>恭喜您,登錄成功:'+ (strlist[1]+'</b>')
65                    response_body = file_data
66                    response = response_start_line + response_headers + "\r\n" + response_body
67                    break
68         # 向客戶端返回 響應數據
69            fp.close()
70         elif strlist[3]=='3': #重置密碼
71             pass
72         else:
73             file_data=r'非法操作'
74             response_body = file_data
75             response = response_start_line + response_headers + "\r\n" + response_body
76         print('發送的數據[%s]' % response)
77         clientSocket.send(bytes(response, "gbk"))
78     #組裝返回包
79     def start_response(self,status,headers):
80         response_headers = "HTTP/1.1 " + status + "\r\n"
81         for header in headers:
82             response_headers += "%s: %s\r\n" % header
83         self.response_headers = response_headers
84     #綁定端口
85     def bind(self,port):
86         self.m_serverSocket.bind(('',port))
87     def parseline(self,strcon):
88         """解析字符串"""
89         pass

3、運行情況

測試命令:http://127.0.0.1:8000/&jifei&123456&2&0&


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM