1. 程式人生 > >Python-Socket網絡編程

Python-Socket網絡編程

image lis process 服務器 互傳 connect 斷開 打開 還要

網絡編程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網絡編程