1. 程式人生 > >python寫簡單的web靜態伺服器,對socket的深入理解。

python寫簡單的web靜態伺服器,對socket的深入理解。

import socket

from multiprocessing import Process

import time

#...使用socket建立簡單的靜態伺服器


def func1(sock):  # 子程序實現的功能
    read_data = sock.recv(2014)    # 接受套接字傳入的資料

    if len(read_data) == 0:  
    # 判斷客戶端關閉/html協議內容未接收到的情況下。
        print('client close....')
        print(sock)
        sock.close
() else: # 能夠獲取read_data split_data = read_data.decode().splitlines() print(split_data[0]) # 獲取使用者請求檔案 response_state_line = 'HTTP/1.1 200 OK\r\n' response_headers = 'Content-Type: text/plain\r\n' response_body = "hello worldjjjjj" print("======test1======="
) # web伺服器根據客戶請求返回內容顯示在web上 response_data = response_state_line+response_headers+"\r\n"+response_body sock.send(response_data.encode()) print("============test3===========") sock.close() def main(): #主程序--設定監聽端及繫結ip listen_socket = socket.socket(socket
.AF_INET, socket.SOCK_STREAM) listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_addr = ('192.168.199.214', 10000) listen_socket.bind(server_addr) listen_socket.listen(128) while True: #主程序不斷嘗試接受瀏覽器請求連線 new_socket, peer_addr = listen_socket.accept() print("asss") p = Process(target=func1, args=(new_socket,)) p.start() print("父程序", new_socket) time.sleep(10) new_socket.close() if __name__ == '__main__': main() ![執行情況:顯然如看到的不同的在accept不斷嘗試連線情況下,socket的fd是可能不變的,在windows條件下,可能會被其他程序暫用fd,但是假設是相同的fd,瀏覽器程序還在不斷的呼叫不同的埠進行連線,一直到主程序的socket關閉(因為主程序的new_socket和子程序的new_socket,不是同一個socket(fd不同),但是他們綁定了相同的ip,瀏覽器ip和埠](http://img.blog.csdn.net/20170608001713764?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這是對埠號的描述,很明顯埠號是不同的。但是為什麼會在子程序的new_socket沒有讀取資料情況下進行else操作,即打印出---test1----,----test2----,個人猜想可能是在子程序的socket沒法讀取資料的情況下,擅自呼叫了父程序的socket,這跟不同程序間的變數是獨立的又相矛盾](http://img.blog.csdn.net/20170608002241298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) # ---------------------跪求正確見解------------------------ # -------------求飯吃 0.0~~~ ![這裡寫圖片描述](http://img.blog.csdn.net/20170608003338272?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](http://img.blog.csdn.net/20170608003356741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)