http協議及使用socket TCP伺服器搭建

2021-10-05 17:03:07 字數 3657 閱讀 6370

特點:

1、基於tcp,瀏覽器和伺服器之間的傳輸協議

2、客戶端請求資料(request header)伺服器答覆(response->header,body)客戶端根據答覆,從而顯示頁面

3、客戶端請求裡面一般包括ip+埠+請求的頁面,當請求的頁面不寫時,預設主頁index

**需求:用python寫乙個程式,充當伺服器,當客戶端請求任何頁面,返回相同的資料

實現:

import socket

#1、建立乙個tcp 套接字

tcp_socket = socket.socket(socket.af_inet, socket.sock_stream)

#2、繫結自身的ip和埠

tcp_socket.bind((''

,8090))

#繫結自身

#3、接收資料

tcp_socket.listen(

128)

#讓伺服器變為監聽模式

while

true

: new_client_socket, client_addr = tcp_socket.accept(

)#等待接收

recv_data = new_client_socket.recv(

1024

)#接收資料

#寫應答頭部

response +=

'\r\n'

response +=

'hahah'

#應答資料

new_client_socket.send(response.encode(

'utf-8'))

#傳送資料

#關閉套接字

new_client_socket.close(

)#4、返回資料

tcp_socket.close(

)

上述**:

1、答覆需要遵守http協議,答覆是header加body,header裡面包括使用協議型別,解碼格式等

2、區分頭部和body用乙個\r\n表示,頭部的每條語句用\r\n表示

案例:使用多程序實現多個客戶端請求資料,返回相應的資料–(使用者需要什麼返回什麼)

實現思路

1、設定固定埠ip的伺服器

2、等待請求資料

3、分析請求資料,獲取請求所需的資料

4、在電腦中找到該資料

5、傳送客戶端需要的資料

**:

import socket

import re

import multiprocessing

#回應請求的指定資料

defget_file

(file_path)

:'''根據檔名,路徑,返回檔案內容'''

with

open

('./html/'

+file_path,

'rb'

)as f:

content = f.read(

)if content :

return content

else

:#在資料夾中未找到

#匹配檔案路徑

if path:

body = get_file(path)

#返回檔案

else

:#匹配為空,這輸入的網域名稱,沒有輸入網域名稱,預設主頁

body = get_file(

'index.html'

) new_client_socket.send(response.encode(

'utf-8'))

#傳送資料

new_client_socket.send(body)

new_client_socket.close(

)def

sent_msg

(tcp_socket)

:while

true

: new_client_socket, client_addr = tcp_socket.accept(

)#等待接收

recv_data = new_client_socket.recv(

1024

)#接收資料

response +=

'\r\n'

#解析請求,並且返回資料

#多程序服務客戶端

p = multiprocessing.process(target=parse_header, args=

(recv_data,new_client_socket,response)

) p.start(

)#關閉套接字

new_client_socket.close(

)#子程序碎片close但是主程序還有乙個指向這個程序,所已主程序和子程序中指向的物件都關閉,才真的關閉

defmain()

:#1、建立乙個tcp 套接字

tcp_socket = socket.socket(socket.af_inet, socket.sock_stream)

#2、繫結自身的ip和埠

tcp_socket.bind((''

,8090))

#繫結自身

#3、接收客戶端需求,並應答

tcp_socket.listen(

128)

#讓伺服器變為監聽模式

#響應函式

sent_msg(tcp_socket)

#4、關閉伺服器

tcp_socket.close(

)if __name__ ==

'__main__'

: main(

)

多執行緒,協程分別實現上述功能

協程實現:

p = gevent.spawn(parse_header,

(recv_data, new_client_socket, response)

)

將後面的new_client_socket.close()的刪除

多執行緒實現(和程序類似):

p = threading.thead(target=parse_header, args=

(recv_data,new_client_socket,response)

)

TCP IP協議Http協議Socket的區別

tpc ip協議是傳輸層協議,主要解決資料如何在網路中傳輸,而http是應用層協議,主要解決如何包裝資料。關於tcp ip和http協議的關係,網路有一段比較容易理解的介紹 我們在傳輸資料時,可以只使用 傳輸層 tcp ip協議,但是那樣的話,如果沒有應用層,便無法識別資料內容,如果想要使傳輸的資料...

socket解析http協議頭

以下為 http客戶端程式 httpclient.c include include include include include include include include include include include include 開始 功能 搜尋字串右邊起的第乙個匹配字元 char ...

網路協議及socket

實體層 就是把電腦連線起來的物理手段。它主要規定了網路的一些電氣特性,作用是負責傳送0和1的電訊號。分組方式 乙太網協議 一組電訊號構成乙個資料報,叫做 幀 frame 每一幀分成兩個部分 標頭 head 和資料 data mac位址 乙太網資料報的 標頭 包含了傳送者和接受者的資訊 資料報必須是從...