好久沒有發博客了,但是也沒閑着,最近疫情原因一直在家遠程辦公,分享一下今天的干貨
先說需求:某個文件壓縮之后可以供用戶點擊下載
沒想到特別好的辦法,在網上搜索大多都是通過socket實現的,然后我這個好久沒寫服務端和客戶端的家伙開始了奮筆疾書,使勁粘貼,源碼附上:
注意!!!啟動時:先服務端,后客戶端。 關閉時:先客戶端后服務端
ps: 說明一下,服務端客戶端端口應一致,因為我搞的時候有不正常釋放端口的異常,所以頻繁切換端口,最后往博客粘的時候出現了不一致端口,想要修改一下的,可是壓縮起來的代碼編輯時候是點不開的,就很愁哈哈不改了
服務端code:

import socket import os def serverSide(): # 在這里我將os.path的默認路徑進行了更改,改到了/mnt/,從/mnt/路徑下找文件下載 os.chdir("/mnt/") print(os.getcwd()) # 創建tcp服務端套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定端口號,ip地址不綁定 tcp_server_socket.bind(("127.0.0.1", 3344)) # 程序結束,釋放端口號,端口號復用 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 設置監聽,把主動套接字變成被動套接字,服務端套接字只負責接收客戶端的連接請求 tcp_server_socket.listen(128) while True: # 創建信的套接字,等待接收客戶端的連接請求 # clientSide() service_client_socket, ip_port = tcp_server_socket.accept() print("客戶端連接成功了:", ip_port) # 接收客戶端的請求信息 file_name_data = service_client_socket.recv(1024) print(file_name_data) # 對二進制數據進行解碼 file_name = file_name_data.decode("utf-8") print(file_name) # 判斷文件是否存在 if os.path.exists(file_name): # 文件存在 with open(file_name, "rb") as file: # 讀取文件數據 while True: # 循環讀取文件數據 file_data = file.read(1024) # 表示讀到數據 if file_data: # 然后把數據發送給客戶端 service_client_socket.send(file_data) else: print("請求的文件數據發送完成") break else: print("您請求下載的文件不存在") # 終止和這個客戶端服務 service_client_socket.close() # 終止客戶端連接請求服務, 服務端的套接字可以不用關閉 tcp_server_socket.close() if __name__ == '__main__': serverSide()
客戶端code:

import socket def clientSide(): # serverSide() # 創建套接字,AF_INET:ipv4,SOCK_STREAM:TCP協議 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服務端連接 tcp_client_socket.connect(("127.0.0.1", 3357)) # 發送下載文件的請求 file_name = input("請輸入要下載的文件名:") # 個人在服務端和客戶端都采用utf-8編碼 file_name_data = file_name.encode("utf-8") # 發送請求數據 tcp_client_socket.send(file_name_data) # 把數據寫入到文件里 with open('/mnt/' + file_name, "wb") as file: while True: # 循環接收文件數據 file_data = tcp_client_socket.recv(1024) # 只要接收到數據,就寫入 if file_data: file.write(file_data) print('====') else: print("服務端把數據發送完成並關閉了連接") break # 關閉套接字 tcp_client_socket.close() if __name__ == '__main__': clientSide()
在把它放到項目中去應用的時候發現每次斷開服務之后端口都不能正常釋放,所以下一次再調用的時候就是端口占用啦,能耐不夠沒有解決
在下又在網上一通翻找,分享一個python的方法,可以實現局域網內目錄文件共享,妙哉。
python2和python3皆可實現
1、首先進入你要共享的路徑,比如:
cd /data/
2、開啟共享服務(默認端口是8000,因為我Django項目,避免沖突,手動8888)
# python2 python -m SimpleHTTPServer 8888 # 或者python3 python -m http.server 8888
3、訪問頁面: 開啟服務的IP+端口8888,例如:192.168.1.165:8888即可訪問/data/目錄下的文件,並支持下載
=======================================分割線=================================================
開啟后台運行模式
# 當前終端后台運行 python -m SimpleHTTPServer 8888 & # 完全后台運行 nohup python -m SimpleHTTPServer 8888 &
好了,大功告成,差一張成功展示的截圖,今天VPN已經沒連了,改日再議吧!
最后,天佑中華!世界和平!武漢加油!中國加油