直接進入正題吧,下面的**都是我在pycharm中寫好,再貼上上來的
importsocket
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...