日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用网络TCP搭建一个简单文件下载器

發(fā)布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用网络TCP搭建一个简单文件下载器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

說明:該篇博客是博主一字一碼編寫的,實(shí)屬不易,請尊重原創(chuàng),謝謝大家!

目錄

一丶項(xiàng)目介紹

二丶服務(wù)器Server

三丶測試TCP server服務(wù)器

四丶客戶端Client

五丶測試客戶端向服務(wù)器下載文件


一丶項(xiàng)目介紹

1.敘述

生活中大家都使用過迅雷吧,用戶在客戶端上使用迅雷從服務(wù)器上download一個文件到客戶端,今天博主就是使用TCP網(wǎng)絡(luò)搭建一個客戶端client連接服務(wù)器server,從服務(wù)器server上下載所想要下載的文件到客戶端client上

2.項(xiàng)目環(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文件用于實(shí)現(xiàn)tcp服務(wù)器客戶端

2.首先在file_download_tcpServer.py中進(jìn)行代碼邏輯編寫

  • step1 創(chuàng)建tcp socket套接字
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
  • step2 綁定本地IP和端口
tcp_server_socket.bind(('', 8888))
  • step3?使用listen將主動套接字變?yōu)楸粍犹捉幼?/li>
tcp_server_socket.listen(128)
  • step4?等待客戶端的鏈接,即為這個客戶端發(fā)送文件,因?yàn)椴恢挂粋€客戶連接,此時需要將(step4~7)代碼寫在while True里面
client_socket, clientAddr = tcp_server_socket.accept()
  • step5 顯示連接的客戶端用戶信息
print("用戶%s 已連接"% str(clientAddr))
  • step6?接收客戶端發(fā)送過來的數(shù)據(jù)獲取客戶要下載的文件,并打印顯示
recv_data = client_socket.recv(1024) # 接收1024個字節(jié) file_name = recv_data.decode("utf-8") print("對方請求下載的文件名為:%s" % file_name)
  • step7 根據(jù)客戶請求下載的文件名,獲取該文件內(nèi)容,并發(fā)送給客戶端
try:with open(filename, "rb") as f:file_content = f.read() except Exception as e:print("獲取文件內(nèi)容出錯:", e)if file_content:client_socket.send(file_content) # 關(guān)閉該套接字 client_socket.close()
  • step8 關(guān)閉服務(wù)器監(jiān)聽套接字
tcp_server_socket.close()

3.封裝(解耦)代碼,博主之所以這樣做,是為了讓大家了解一個正確開發(fā)過程,提高代碼復(fù)用性

從上面代碼可以看出耦合性比較嚴(yán)重,看著雜亂無章比較費(fèi)勁,所以需要對代碼進(jì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二進(jìn)制,所以這里不需要進(jìn)行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ù)器運(yùn)行方式為python3 xxx.py 8888,將服務(wù)器綁定端口號傳入到代碼中

  • step1?指定TCP服務(wù)器啟動為終端命令python3 xxx.py 8888方式,這個比較新穎,這里博主給大家詳細(xì)進(jìn)行演示,這里博主在項(xiàng)目目錄下創(chuàng)建demo.py文件用于演示,在demo.py中進(jìn)行如下編寫
import sys print(len(sys.argv))
  • step2?在pycharm中直接運(yùn)行run demo.py結(jié)果如下

  • step3 在pycharm Terminal終端執(zhí)行python3 demo.py 8888 ,打印出sys.argv的長度為2,結(jié)果為列表所以打印的第一個元素值為文件名第二元素的值為傳入的端口號,所以說如果sys.argv的長度為1代表直接運(yùn)行,為2時表示是以python3 xxx.py 8888方式運(yùn)行,由此可以進(jìn)行邏輯判斷

?

  • step4 在main主函數(shù)第一行加入以下代碼,并將bing方法中的端口參數(shù)修改為port
def main():import sysif len(sys.argv) != 2:print("請按照如下方式運(yùn)行:python3 xxx.py 8888")returnelse:# 運(yùn)行方式為python3 xxx.py 8888port = int(sys.argv[1]) # 8888

?三丶測試TCP server服務(wù)器

1.在Terminal終端執(zhí)行python3 file_download_tcpServer.py 沒有傳入端口號,出現(xiàn)定義的提示

2.在Terminal終端執(zhí)行python3 file_download_tcpServer.py 8888即成功運(yùn)行tcp 服務(wù)器并綁定8888端口,終端光標(biāo)開始閃爍等待客戶端的連接

3.打開網(wǎng)絡(luò)調(diào)試助手,選擇TCP client客戶端,IP地址為本機(jī)IP 端口為服務(wù)器綁定端口號8888,

4.點(diǎn)擊連接成功后,回到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中進(jìn)行代碼邏輯編寫,相對服務(wù)器來說客戶端的代碼實(shí)現(xiàn)就比較簡單,首先定義main主函數(shù)用于客戶端創(chuàng)建套接字連接目標(biāo)服務(wù)器

  • step1 創(chuàng)建套接字
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
  • step2 連接目標(biāo)服務(wù)器
tcp_client_socket.connect((input("請輸入服務(wù)器ip:"), int(input("請輸入服務(wù)器port:"))))
  • step3 輸入要下載的文件名,并向服務(wù)器發(fā)送
file_name = input("請輸入要下載的文件名:") tcp_client_socket.send(file_name.encode("utf-8"))
  • step4?接收服務(wù)器發(fā)送過來的數(shù)據(jù),接收1024個字節(jié)(1K)
recv_data = tcp_client_socket.recv(1024)
  • step5 接收數(shù)據(jù)不為空時,寫入到本地客戶端
if recv_data:with open("[接收]"+file_name, "wb") as f:f.write(recv_data)
  • step6 關(guān)閉客戶端套接字
tcp_client_socket.close()

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ù)器運(yùn)行在8888端口上,此時服務(wù)器正等待客戶端連接

2.在pycharm上直接run運(yùn)行?file_download_tcpClient.py客戶端

  • step1 運(yùn)行后則顯示輸入服務(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頭像圖片,進(jìn)行測試

  • step1 查看1.jpg文件

  • step2 因?yàn)樵搱D片大小為42.04K所在在客戶端中recv方法的參數(shù)值必須大于文件大小值,所以這里我修改為100000,1024=1k,不然的話下載的圖片會出現(xiàn)模糊以及殘缺
recv_data = tcp_client_socket.recv(100000)
  • step3?運(yùn)行file_download_tcpClient.py程序,向服務(wù)器發(fā)送下載1.jpg文件請求,

  • step4? 查看下載后的[接收]1.jpg文件并與1.jpg文件進(jìn)行對比,屬性均一致,表示搭建的tcp文件下載器成功

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/cdtaogang/p/10631071.html

總結(jié)

以上是生活随笔為你收集整理的使用网络TCP搭建一个简单文件下载器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。