程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python編程:socket實現文件傳輸(文件服務器簡易版)

編輯:Python

題目:

使用 socket 編程實現一個簡單的文件服務器。客戶端程序實現 put 功能 ( 將一個 文件從本地傳到文件服務器 ) 和 get 功能 ( 從文件服務器取一遠程文件存為本地 文件 ) 。客戶端和文件服務器不在同一台機器上。
客戶下載文件:get 文件名 如:get file1.txt
客戶上傳文件:put 文件名 如:put file2.txt

注:下面代碼是在一台機器上實現的,如果要在不同機器上,將客戶端連接服務器那裡的IP地址改為服務器的IP地址即可(前提要求:服務器和客戶端能ping通)。

服務器端代碼

# encoding=utf-8
# 服務器端
import socket
import os
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 9000)) # 綁定監聽端口
server.listen(5) # 監聽
dirPath = 'F:\\fileServer\\'; # 文件服務器位置
print("服務器運行中···")
while True:
conn, addr = server.accept() # 等待連接
print('client addr:', addr) # conn連接客戶端
while True:
data = conn.recv(1024) # 接收
if not data: # 客戶端已斷開
print('客戶端斷開連接')
break
print('收到的命令:', data.decode("utf-8"))
op = ''
try:
op, filename = data.decode('utf-8').split(' ')
filePath = dirPath + filename
except :
print('輸入和文件操作無關')
#客戶下載任務
if op == 'get':
if os.path.isfile(filePath): # 判斷文件存在
# 1.先發送文件大小,讓客戶端准備接收
size = os.stat(filePath).st_size # 獲取文件大小
conn.send(str(size).encode('utf-8')) # 發送數據長度
print('發送的大小:', size)
# 2.發送文件內容
conn.recv(1024) # 接收確認
f = open(filePath, 'rb')
for line in f:
conn.send(line) # 發送數據
f.close()
else: # 文件不存在情況
conn.send('文件不存在'.encode("utf-8"))
#客戶上傳任務
if op == 'put':
# 1.先接收文件長度
server_response = conn.recv(1024)
file_size = int(server_response.decode("utf-8"))
print('接收到的大小:', file_size)
# 2.接收文件內容
filename = 'new' + filename
filePath = dirPath + filename
f = open(filePath, 'wb')
received_size = 0
while received_size < file_size:
size = 0 # 准確接收數據大小,解決粘包
if file_size - received_size > 1024: # 多次接收
size = 1024
else: # 最後一次接收完畢
size = file_size - received_size
filedata = conn.recv(size) # 多次接收內容,接收大數據
filedata_len = len(data)
received_size += filedata_len
print('已接收:', int(received_size / file_size * 100), "%")
f.write(filedata)
f.close()
server.close()

客戶端代碼:

#encoding=utf-8
import socket
import os
client = socket.socket() # 生成socket連接對象
ip_port = ('127.0.0.1', 9000) # 地址和端口號
try:
client.connect(ip_port) # 連接
print('服務器已連接')
except :
print('服務器連接失敗,請修改後重新運行!!')
exit(0)
while True:
#content = input(">>")
content = input('請輸入你要進行的文件操作:')
if content=='exit': #退出操作
exit(1)
client.send(content.encode())
if len(content) == 0: # 如果傳入空字符繼續運行
continue
if content.startswith("get"): #下載任務
client.send(content.encode("utf-8")) # 傳送和接收都是bytes類型
# 1.先接收長度,如果接收長度報錯,說明文件不存在
server_response = client.recv(1024)
try:
file_size = int(server_response.decode("utf-8"))
except:
print('文件不存在')
continue
print('接收到的大小:', file_size)
# 2.接收文件內容
filename = 'new' + content.split(' ')[1]
f = open(filename, 'wb')
received_size = 0
while received_size < file_size:
size = 0 # 准確接收數據大小,解決粘包
if file_size - received_size > 1024: # 多次接收
size = 1024
else: # 最後一次接收完畢
size = file_size - received_size
data = client.recv(size) # 多次接收內容,接收大數據
data_len = len(data)
received_size += data_len
print('已接收:', int(received_size / file_size * 100), "%")
f.write(data)
f.close()
elif content.startswith('put'): #上傳任務
op, filename = content.split(" ")
if os.path.isfile(filename): # 判斷文件存在
# 1.先發送文件大小,讓客戶端准備接收
size = os.stat(filename).st_size # 獲取文件大小
client.send(str(size).encode("utf-8")) # 發送數據長度
print('發送的大小:', size)
# 2.發送文件內容
f = open(filename, 'rb')
for line in f:
client.send(line) # 發送數據
f.close()
else: # 文件不存在情況
print('文件不存在') # 發送數據長度
f.close()
else:
pass
client.close()

結果展示:

初始狀態:

運行過程:

服務器端:

客戶端:

最終結果:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved