socket手寫乙個簡單的web服務端

2022-02-09 08:48:47 字數 2947 閱讀 2455

直接進入正題吧,下面的**都是我在pycharm中寫好,再貼上上來的

import

socket

server =socket.socket()

server.bind((

'127.0.0.1

', 8080)) #

注意bind是server的乙個方法,規定傳兩個引數,乙個是它基本本身,另乙個

#就是ip埠位址,所以我們用元組的方式傳參

server.listen(5) #

設定監聽數,同一時刻,最多與五個客戶端進行通訊

print('

正在監聽8080埠.......')

while

true:

conn, address = server.accept() #

有客戶端連線才會執行到這裡,並且返回兩個引數,乙個是跟改客戶端進行通訊的套接字,乙個是該客戶端的ip位址

data = conn.recv(1024)

print(data) #

這裡我們先列印下客戶端到底給我們傳來了什麼資料

conn.send(b

'hello word

') #

接收到資料,我們也向web頁面返回乙個資訊,

conn.close()

#關閉套接字

#記住一點,socket,他們之間傳送的資料都是二進位制的格式

#

下面是我print(data)的列印效果,我做了適當的換行操作,因為\r\n就是換行嘛,這就是通過瀏覽器訪問我寫的服務端帶來的資料

#我就在下面**寫寫自己注釋了。

#不知道你們跟著寫了沒有,但是我這裡通過火狐,ie瀏覽器訪問,頁面內容是hello word,谷歌瀏覽器的頁面不能解析b'hello word'

# 出現這樣的情況,肯定是火狐,ie瀏覽器它內部給你封裝了,所以頁面能顯示hello word

#按理說,瀏覽器向服務端按著某種格式傳送(也就是下面這段),服務端應該也要傳送某種格式的資訊給瀏覽器,這樣才瀏覽器才能解釋。

'''get / http/1.1\r\n #這是請求首行

請求方式 url http協議版本號\r\n #這就是請求首行的內容,注意有空格,必須要有空格。\r\n記得換行就行了

host: 127.0.0.1:8080\r\n

user-agent: mozilla/5.0 (windows nt 10.0; win64; x64; rv:63.0) gecko/20100101 firefox/63.0\r\n

accept-language: zh-cn,zh;q=0.8,zh-tw;q=0.7,zh-hk;q=0.5,en-us;q=0.3,en;q=0.2\r\n

accept-encoding: gzip, deflate\r\n

connection: keep-alive\r\n

upgrade-insecure-requests: 1\r\n\r\n' #這上面的就是請求頭,key:value

............ #如果是post方法去請求的話,....的位置就是請求體了,我舉得例子是get請求,所以就沒有請求體,

但是請求體是有的。

'''

#

那麼服務端應該以那種格式,響應回瀏覽器呢?

'http/1.1 200 ok\r\n\r\n你要響應過去的資料'#

上面的格式中 200是狀態碼,ok就是狀態碼的原因短語,兩個換行符下面就是響應體了

#所以我直接接著while迴圈那裡更改

思考拓展:首先我們可以通過瀏覽器帶來請求的資料中,找到它指定的url(這個資訊就在請求首行中),

我們可以通過字串的一些方法,拿到,再進行判斷,如果是index就返回index的頁面,也就是根據

相應的url,我們返回相應的**。

說到**,我們怎麼將**返回過去呢?首先在你的服務端機器上必須要有這個網頁,我們可以通過文

件的讀取,將內容通過二進位制返回過去。

既然說了,那下面我就寫寫,還是接著最開始while迴圈開始

為什麼這樣操作,之前寫了

url = data.split('

\r\n

')[0].split('

')[1] #

data資料上面有,通過這樣我們找到url

info =none

if url == '

/index':

with open(

'index.html

', 'rb'

) as f:

info =f.read()

else

: info = b'

404'

conn.send(info)

conn.close()

#注意了沒有,上面**我寫了兩句conn.send,這樣寫也是可以的,因為tcp是流式協議。

#我就寫了乙個邏輯操作,方法就是這樣,會了的話,自己再多添幾個就行了,但是必須你本地要有該網頁

手寫乙個簡單的HashMap

package com.lzq.mapinte ce public inte ce map package com.lzq.hashmap public class entry 編寫hashmap類 package com.lzq.hashmap import com.lzq.mapinte ce....

動手寫乙個簡單的promise

promise 是非同步程式設計的一種解決方案,比傳統的解決方案 函式和事件 更合理和更強大。它由社群最早提出和實現,es6 將其寫進了語言標準,統一了用法,原生提供了promise物件。所謂promise,簡單說就是乙個容器,裡面儲存著某個未來才會結束的事件 通常是乙個非同步操作 的結果。從語法上...

乙個簡單的多執行緒socket

碼了2個小時多,終於弄完了。用的編輯器是qt creator 突然發現在qt creator上,也支援這些底層的c語言。在linux上除錯無誤。寫這個,也算是自己讀書的記錄吧!include include include include include include include includ...