本文為大家分享了python cs架構實現簡單文件的傳輸代碼,供大家參考,具體內容如下
要實現簡單文件的傳輸我們必須考慮這些問題:
1.什么是c/s架構?
顧名思義,就是客戶端端/服務器架構。不同的人可能回答不一,但是有一點是相同的:服務器是一個軟件或硬件,用于向一個或多個客戶端提供所需要的服務,服務器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然后等待其他的請求。
2.客戶端與服務端如何通信?
其實說白了就是互聯網中兩個主機該如何通信,首先我們用ip地址可以標示一臺主機,這樣就可以通信了么?當然也不行,我們還得標示主機中的進程,當然協議也是不可或缺的,是udp報文協議還是tcp數據流協議,這的看你個人的需求。用套介子來作為一個標示符,唯一標識網絡進程。
想明白這兩個問題我覺得這個問題有三分之一已經解決了,接下來呢我選擇tcp協議來傳輸。
服務端:
采用socket()函數 定義socket描述字
bind()函數來把地址族中一個特定地址賦給socket,簡單來說就是把一個ipv4/ipv6地址+端口號組合賦給socket
listen()函數把socket變成被動類型的,等待客戶連接請求。
當客戶端發來消息時用accept()函數來接受請求,同時給服務端返回客戶端的socket描述字,接下來服務端以接收到的描述字來向客戶端發送信息以及接受信息。
我們這個程序是實現文件傳輸,我的想法是類似于ftp程序接受客戶上傳下載文件的需求。服務端啟動后監聽端口(我用的9500)等待客戶連接??蛻舳巳挝帐纸⑦B接后,客戶輸入命令來向客戶端發起請求,輸入‘ls'命令可以查看服務端可下載的文件,輸入‘put 文件名',‘get 文件名'可以上傳下載文件。上傳文件時客戶端打開本地文件以二進制方式讀取文件內容并同時調用send()函數發送文件內容,服務端以寫方式打開文件并將客戶端上傳內容寫入文件,實現文件的上傳。下載文件與此類似,客戶端上傳送‘get 文件名'命令同時以寫方式打開文件 ,服務端收到命令以讀方式打開文件,并發送給服務端。
tcp三次握手建立連接:
當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到連接請求,即收到SYN J包,調用accept函 數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1之后,這時connect返回,并對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。
新聞熱點
疑難解答