# 編寫人:Jaoany
# 開發時間:2021/7/23 15:57
# ! /usr/bin/env python
# -*- coding=utf-8 -*-
# http瀏覽器接口,可以運行訪問自己寫的代碼或者界面或者網頁
import socket # 用套接字編程
# serverport是服務器端口,將服務器和客戶端端口號設置一致,才可以相互通信可以直接賦值
# (主機ip地址,和主機的端口號,這里主機指你用來作為服務器的計算機)
serverPort = 6699
# 設置端口號和本地ip
bind_ip = "127.0.0.1"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 在建立套接字文件描述符成功后,需要對套接字進行地址和端口的綁定,才能進行數據的接收和發送操作。
server.bind((bind_ip, serverPort))
# server.listen()是tls模塊內的Socket類的內置應用程序編程接口,用於啟動服務器以偵聽加密的連接。
'''
這里的5,指的是等待的進程數,比如有105個進程,可以並發執行100個,其余最多有五個五個可以掛起,第106個進程直接被操作系統拒絕處理,等待前面處理完再到其他排隊等待的,
也就是在拒絕連接之前,操作系統可以掛起的最大連接數量。
該值至少為1,大部分應用程序設為5就可以了。
'''
server.listen(5)
print('the server is ready to receive')
# headers = {}使用http協議的時候要用headers傳參,請求頭(request headers)和響應頭(response headers)
# get_headers()是PHP中一個系統級函數,他可以返回一個包含有服務器響應一個HTTP請求所發送的標頭的數組。
# 如果失敗則返回 FALSE 並發出一條 E_WARNING 級別的錯誤信息(可用來判斷遠程文件是否存在)。
# 將for循環的結果存儲到列表(line_list)中
#for line in line_list:這是一個循環
def get_headers(line_list):
headers = {}
for line in line_list:
new_line = line.decode('utf8')
'''
# find() 方法,檢測字符串中是否包含子字符串 str ,
# str.find(str, beg=0, end=len(string))
# 如果指定 beg(開始) 和 end(結束) 范圍,則檢查是否包含在指定范圍內,如果指定范圍內包含指定索引值,則返回索引值在字符串中的起始位置,否則返回-1。
# 該語句表示檢查字符串newline中是否包含字符串“:”
# find()方法對大小寫敏感
# index方法與find方法相同
# 只是:index()方法在沒有找到指定字符串的時候會拋出異常.
# 另外,index()也可以用於List對象,返回指定元素的索引,用法相同.
'''
index = new_line.find(':')
key = new_line[:index]
value = new_line[index + 1:].strip()
headers[key] = value
return headers
'''
strip()方法用於移除字符串頭尾指定的字符(默認為空格或者換行符)或字符序列。
注意:該方法只能刪除開頭或是結尾的字符,不能刪除中間部分的字符。
strip()方法的語法:str.strip([chars])
返回移除字符串頭尾指定的字符生成的新的字符串。
'''
# 動態獲取請求報文需要的資源
while True:
# 開始等待,接受連接請求
client, addr = server.accept()
"Accepted connection from: %s:%d" % (addr[0], addr[1])
try:
# 調用recv()函數,接收字節,每次接收1024個,但是實際上可能發送的並沒有1024個,這個時候recv並不會一直等待着,而在一定的時間之后能接受多少先接收多少。
# # 接收到客戶連接請求后,建立新的TCP連接套接字
sentence = client.recv(1024)
# 先用split('.')方法將字符串以"."開割形成一個字符串數組,然后再通過索引[1]取出所得數組中的第二個元素的值
'''
split()方法是將指定字符串按某指定的分隔符進行拆分,拆分將會形成一個字符串的數組並返回。
數組中的每元素都各自對應一個索引值,就好比在數據庫的表中每行數據紀錄都擁有自己的索引ID一樣數組元素的索引值是從0開始計數的,也就是說第一個元素的索引值是0,往后依次加1。
我們可以用數組的索引值來取對應位置的數組元素的值,比如說我們要取數組的第一個“aa”,那么我們就可以這樣寫 :string aa = strArray[0]。
'''
filename = sentence.split()[1]
# r"index.html", "r" 讀取本地文件
#f = open('所要打開文件的url地址,注意斜杠必須是“/”,反了就不行'+filename.decode('utf-8'), 'rb')
f = open('C:/Users/Jaoany/Desktop/工作/發郵件接口' + filename.decode('utf-8'), 'rb')
f=print('hello,jaoany')
line_list = sentence.split(b'\r\n')
headers = get_headers(line_list)
for i in line_list:
print(i)
accept = str(headers.get('Accept').split(',')[0].strip())
# 將從文件中讀取的數據賦值給putputdata
outputdata = f.read()
header = ' HTTP/1.1 200 OK\r\n' \
'Connection: close\r\n' \
'Content-Type: ' + accept + '\r\n' \
'Content-Length: %d\r\n\r\n' % (len(outputdata)) # 長度設置 important
# 將所請求文件的內容發送到客戶端
client.send(header.encode() + outputdata)
client.close()
except IOError:
# 異常處理,發送未找到文件的響應消息
header = ' HTTP/1.1 404 Not Found'
client.send(header.encode())