標籤:電腦 迴圈 直接 協議 測試流程 使用 encode 字元 監聽
網路編程Socket介紹
電腦之間相互傳遞資料的資料類型很多,比如視頻、圖片、檔案等等,但是在網路上各種類型的資料所支援的協議不同,網路上有很多種協議,例如http、smtp、dns、ftp、ssh、icmp等等,其實這些協議也是一些資料流的交換,只不過工作方式有所不同,無論他們如何變幻,都離不開資料的交換,資料的交換無非也就是發(send)和收(receive)兩個動作,但是這個發送和接收實現起來太複雜,所以就把這個底層的東西進行了封裝,這個封裝的產物就是socket,調用socket就是在調用TCP/IP。
在寫代碼之前先聲明,TCP/IP不需要我們關心了,因為socket都進行了封裝,所以第一步要聲明socket(import socket),第二步聲明協議(socket.TCP/IP),第三步串連(connect(a.ip,a.port)),第四步發送資料(scoket.send(hello)),接收資料(recv()),關閉串連(socket.close())基於此虛擬碼步驟,可以實現一個簡單的發送端;接收端(服務端)的話,第一步聲明socket(import socket),第二步聲明協議(socket.TCP/IP),第三步監聽連接埠(socket.listen(ip,port)),第四步等待資料(waiting),第五步收資料(recv()),最後還可以發資料(send())。
寫一個試試吧!!!
用戶端代碼
服務端代碼
測試流程:先開啟服務端,再開啟用戶端。現在只能發送和接收一條資料。
剛才傳送的是英文字元,那要是傳送中文字元是什麼效果呢?
用戶端代碼
服務端代碼
測試:
這個報錯得通過encode和decode來解決,我這裡服務端沒做修改,只更改了用戶端代碼,改完之後再進行測試沒有報錯,成功發送返回漢字
上面的代碼只能接受和發送一次資料,那麼要想實現多次的發送和接收呢?
用戶端代碼
服務端代碼
現在使用單用戶端串連並連續發送資料沒有問題,那麼嘗試著斷開用戶端試試有啥效果?答案是服務端進入了一個死迴圈,此處不再,為什麼呢?因為用戶端斷開後,服務端還在revc(1024)去接收資料,一直接收不到資料,所以就進入了一個死迴圈。那解決方案就是加一個判斷語句試一下。
服務端代碼
問題又來了?我們想要的效果是用戶端A斷開後,服務端就接著串連用戶端B了,那現在服務端都斷開了,還怎麼繼續? 應該讓伺服器端持續的保持接收用戶端的串連,所以還要修改服務端的代碼。還需要加一個while迴圈。
現在首先開啟服務端程式,再開啟兩個用戶端程式,把其中的一個用戶端斷開後,看結果。會探索服務端串連了第二個用戶端。
再來測試
what????發空就直接卡住了。。。因為不能send空,要修改用戶端代碼,加一個判斷
Python-Socket網路編程