使用网络TCP搭建一个简单文件下载器
說明:該篇博客是博主一字一碼編寫的,實屬不易,請尊重原創(chuàng),謝謝大家!
目錄
一丶項目介紹
二丶服務(wù)器Server
三丶測試TCP server服務(wù)器
四丶客戶端Client
五丶測試客戶端向服務(wù)器下載文件
一丶項目介紹
1.敘述
生活中大家都使用過迅雷吧,用戶在客戶端上使用迅雷從服務(wù)器上download一個文件到客戶端,今天博主就是使用TCP網(wǎng)絡(luò)搭建一個客戶端client連接服務(wù)器server,從服務(wù)器server上下載所想要下載的文件到客戶端client上
2.項目環(huán)境
操作系統(tǒng):Windows7?
IDE:PyCharm2017
編程語言:python3.x
測試工具:網(wǎng)絡(luò)調(diào)試工具3.x
二丶服務(wù)器Server
1.在PyCharm中創(chuàng)建file_download_tcpServer.py和file_download_tcpClient.py文件用于實現(xiàn)tcp服務(wù)器客戶端
2.首先在file_download_tcpServer.py中進行代碼邏輯編寫
- step1 創(chuàng)建tcp socket套接字
- step2 綁定本地IP和端口
- step3?使用listen將主動套接字變?yōu)楸粍犹捉幼?/li>
- step4?等待客戶端的鏈接,即為這個客戶端發(fā)送文件,因為不止一個客戶連接,此時需要將(step4~7)代碼寫在while True里面
- step5 顯示連接的客戶端用戶信息
- step6?接收客戶端發(fā)送過來的數(shù)據(jù)獲取客戶要下載的文件,并打印顯示
- step7 根據(jù)客戶請求下載的文件名,獲取該文件內(nèi)容,并發(fā)送給客戶端
- step8 關(guān)閉服務(wù)器監(jiān)聽套接字
3.封裝(解耦)代碼,博主之所以這樣做,是為了讓大家了解一個正確開發(fā)過程,提高代碼復(fù)用性
從上面代碼可以看出耦合性比較嚴(yán)重,看著雜亂無章比較費勁,所以需要對代碼進行解耦操作,降低代碼耦合性,獲取客戶端下載文件內(nèi)容可以封裝到一個方法里(get_file_content),而tcp 服務(wù)器創(chuàng)建套接字以及關(guān)閉都可以封裝到main方法里面,如下所示
def get_file_content(filename):"""獲取文件內(nèi)容"""try:with open(filename, "rb") as f:content = f.read()return contentexcept Exception as e:print("獲取文件內(nèi)容出錯:", e)def main():# 創(chuàng)建sockettcp_server_socket = socket(AF_INET, SOCK_STREAM)# 綁定本地信息tcp_server_socket.bind(('', 8888))# 使用listen將主動套接字變?yōu)楸粍犹捉幼謙cp_server_socket.listen(128)while True:# 等待客戶端的鏈接,即為這個客戶端發(fā)送文件client_socket, clientAddr = tcp_server_socket.accept()print("用戶%s 已連接"% str(clientAddr))# 接收客戶端發(fā)送過來的數(shù)據(jù)獲取客戶要下載的文件名recv_data = client_socket.recv(1024) # 接收1024個字節(jié)file_name = recv_data.decode("utf-8")print("對方請求下載的文件名為:%s" % file_name)file_content = get_file_content(file_name)# 發(fā)送文件的數(shù)據(jù)給客戶端,獲取文件內(nèi)容使用rb二進制,所以這里不需要進行encode編碼操作if file_content:client_socket.send(file_content)# 關(guān)閉客戶端套接字client_socket.close()# 關(guān)閉服務(wù)器監(jiān)聽套接字tcp_server_socket.close()if __name__ == "__main__":main()4. 指定服務(wù)器運行方式為python3 xxx.py 8888,將服務(wù)器綁定端口號傳入到代碼中
- step1?指定TCP服務(wù)器啟動為終端命令python3 xxx.py 8888方式,這個比較新穎,這里博主給大家詳細進行演示,這里博主在項目目錄下創(chuàng)建demo.py文件用于演示,在demo.py中進行如下編寫
- step2?在pycharm中直接運行run demo.py結(jié)果如下
- step3 在pycharm Terminal終端執(zhí)行python3 demo.py 8888 ,打印出sys.argv的長度為2,結(jié)果為列表所以打印的第一個元素值為文件名第二元素的值為傳入的端口號,所以說如果sys.argv的長度為1代表直接運行,為2時表示是以python3 xxx.py 8888方式運行,由此可以進行邏輯判斷
?
- step4 在main主函數(shù)第一行加入以下代碼,并將bing方法中的端口參數(shù)修改為port
?三丶測試TCP server服務(wù)器
1.在Terminal終端執(zhí)行python3 file_download_tcpServer.py 沒有傳入端口號,出現(xiàn)定義的提示
2.在Terminal終端執(zhí)行python3 file_download_tcpServer.py 8888即成功運行tcp 服務(wù)器并綁定8888端口,終端光標(biāo)開始閃爍等待客戶端的連接
3.打開網(wǎng)絡(luò)調(diào)試助手,選擇TCP client客戶端,IP地址為本機IP 端口為服務(wù)器綁定端口號8888,
4.點擊連接成功后,回到pycharm Terminal終端,此時終端顯示用戶XXXX已連接
5.在網(wǎng)絡(luò)調(diào)試助手中發(fā)送demo.py文件名(client發(fā)送下載文件名必須存在于服務(wù)器端),此時服務(wù)器獲取客戶端發(fā)送的下載文件名,獲取該文件的內(nèi)容發(fā)送給客戶端,代表服務(wù)器代碼邏輯編寫正確
- step1 服務(wù)端顯示如下
- step2 客戶端顯示如下?
?四丶客戶端Client
1.在file_download_tcpClient.py中進行代碼邏輯編寫,相對服務(wù)器來說客戶端的代碼實現(xiàn)就比較簡單,首先定義main主函數(shù)用于客戶端創(chuàng)建套接字連接目標(biāo)服務(wù)器
- step1 創(chuàng)建套接字
- step2 連接目標(biāo)服務(wù)器
- step3 輸入要下載的文件名,并向服務(wù)器發(fā)送
- step4?接收服務(wù)器發(fā)送過來的數(shù)據(jù),接收1024個字節(jié)(1K)
- step5 接收數(shù)據(jù)不為空時,寫入到本地客戶端
- step6 關(guān)閉客戶端套接字
2.客戶端完整代碼
from socket import *def main():# 創(chuàng)建socket套接字tcp_client_socket = socket(AF_INET, SOCK_STREAM)# 連接目標(biāo)服務(wù)器tcp_client_socket.connect((input("請輸入服務(wù)器ip:"), int(input("請輸入服務(wù)器port:"))))# 輸入需要下載的文件名file_name = input("請輸入要下載的文件名:")# 向服務(wù)器發(fā)送文件下載請求tcp_client_socket.send(file_name.encode("utf-8"))# 接收服務(wù)器發(fā)送過來的數(shù)據(jù)recv_data = tcp_client_socket.recv(1024)print('接收到的數(shù)據(jù)為:', recv_data.decode('utf-8'))# 接收數(shù)據(jù)不為空時,寫入到本地客戶端,if recv_data:with open("[接收]"+file_name, "wb") as f:f.write(recv_data)# 關(guān)閉套接字tcp_client_socket.close()if __name__ == "__main__":main()五丶測試客戶端向服務(wù)器下載文件
1.首先在Terminal終端上執(zhí)行python3?file_download_tcpServer.py 8888將服務(wù)器運行在8888端口上,此時服務(wù)器正等待客戶端連接
2.在pycharm上直接run運行?file_download_tcpClient.py客戶端
- step1 運行后則顯示輸入服務(wù)器的IP,端口以及要下載的文件名,發(fā)送請求給服務(wù)器成功則服務(wù)器會將該文件的內(nèi)容發(fā)送給客戶端,此時打印出demo.py文件中的內(nèi)容,并在本地客戶端成功創(chuàng)建一個[接收]demo.py文件
- step2 查看是否存在?[接收]demo.py文件
- step3 查看該文件內(nèi)容,與demo.py內(nèi)容一致表示從服務(wù)器下載文件成功
- step4 查看Terminal服務(wù)器顯示,顯示出客戶端請求下載的文件名正確
3.在服務(wù)器目錄下存放一張1.jpg頭像圖片,進行測試
- step1 查看1.jpg文件
- step2 因為該圖片大小為42.04K所在在客戶端中recv方法的參數(shù)值必須大于文件大小值,所以這里我修改為100000,1024=1k,不然的話下載的圖片會出現(xiàn)模糊以及殘缺
- step3?運行file_download_tcpClient.py程序,向服務(wù)器發(fā)送下載1.jpg文件請求,
- step4? 查看下載后的[接收]1.jpg文件并與1.jpg文件進行對比,屬性均一致,表示搭建的tcp文件下載器成功
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/cdtaogang/p/10631071.html
總結(jié)
以上是生活随笔為你收集整理的使用网络TCP搭建一个简单文件下载器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《剑指offer》第三十五题(复杂链表的
- 下一篇: 一个注解搞定