1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python编程:socket实现文件传输(文件服务器简易版)

Python编程:socket实现文件传输(文件服务器简易版)

时间:2020-01-18 12:24:42

相关推荐

Python编程:socket实现文件传输(文件服务器简易版)

题目:

使用 socket 编程实现一个简单的文件服务器。客户端程序实现 put 功能 ( 将一个 文件从本地传到文件服务器 ) 和 get 功能 ( 从文件服务器取一远程文件存为本地 文件 ) 。客户端和文件服务器不在同一台机器上。

客户下载文件:get 文件名 如:get file1.txt

客户上传文件:put 文件名 如:put file2.txt

注:下面代码是在一台机器上实现的,如果要在不同机器上,将客户端连接服务器那里的IP地址改为服务器的IP地址即可(前提要求:服务器和客户端能ping通)。

服务器端代码

# encoding=utf-8# 服务器端import socketimport osserver = 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('客户端断开连接')breakprint('收到的命令:', data.decode("utf-8"))op = ''try:op, filename = data.decode('utf-8').split(' ')filePath = dirPath + filenameexcept :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' + filenamefilePath = dirPath + filenamef = open(filePath, 'wb')received_size = 0while received_size < file_size:size = 0 # 准确接收数据大小,解决粘包if file_size - received_size > 1024: # 多次接收size = 1024else: # 最后一次接收完毕size = file_size - received_sizefiledata = conn.recv(size) # 多次接收内容,接收大数据filedata_len = len(data)received_size += filedata_lenprint('已接收:', int(received_size / file_size * 100), "%")f.write(filedata)f.close()server.close()

客户端代码:

#encoding=utf-8import socketimport osclient = 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: # 如果传入空字符继续运行continueif 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('文件不存在')continueprint('接收到的大小:', file_size)# 2.接收文件内容filename = 'new' + content.split(' ')[1]f = open(filename, 'wb')received_size = 0while received_size < file_size:size = 0 # 准确接收数据大小,解决粘包if file_size - received_size > 1024: # 多次接收size = 1024else: # 最后一次接收完毕size = file_size - received_sizedata = client.recv(size) # 多次接收内容,接收大数据data_len = len(data)received_size += data_lenprint('已接收:', 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:passclient.close()

结果展示:

初始状态:
运行过程:

服务器端:

客户端:

最终结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。