题目:

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

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

服务器端代码

# encoding=utf-8
# 服务器端
import socket
import 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 socket
import 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:pass
client.close()

结果展示:

初始状态:

运行过程:

服务器端:

客户端:

最终结果:

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

  1. python文件传输socket_树莓派采用socket方式文件传输(python)

    两个树莓派,在同一个局域网内,传输文件,采用socket方式. client端代码: import socket import os import hashlib client = socket.so ...

  2. 文件传输_python socket实现文件传输(防粘包)

    1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...

  3. 基于Socket的文件传输(使用CSocket类)

    本软件使用MFC采用面向对象的方法实现了基于Socket的文件传输.这是原来研究生课程的结课作业,实现了Socket的发送和接收,以及读取ini配置文件等操作.使用了CSocket类 以下是当时结课作 ...

  4. html大文件传输,socket大文件传输

    遇到了在c#中socket如何实现大文件传输 接收端 private void Receive(Socket socket) { NetworkStream ns = new NetworkStrea ...

  5. python关于文件的编程题_《Python编程》源代码文件

    压缩包 : bbc59749e0028c3f1ab3a1c9a762a6d.rar 列表 <Python编程>源代码文件/.gitignore <Python编程>源代码文件/ ...

  6. 在jupter中利用Python编程查看pkl文件内容的步骤

    pkl文件是python保存文件的一种格式. 下面以 test.pkl 文件为例,展示在jupter中利用Python编程查看pkl文件内容的步骤. 一.查看Python代码所在的文件夹 import ...

  7. Linux平台基于socket的文件传输服务器和客户端

    Linux平台基于socket的文件传输服务器和客户端 目录 前言 一.服务器程序结构 二.客户程序结构 三.代码 1.服务器主程序video_serv_fork.c 2.服务器子程序video_tr ...

  8. Java 基于TCP的socket实现文件传输

    Java 基于TCP的socket实现文件传输 基于TCP的socket结合java的io流 实现客户端与服务器之间的文件传输 Socket 套接字(socket)是一个抽象层,应用程序可以通过它发送 ...

  9. Python实现基于HTTP文件传输实例

    这篇文章主要介绍了Python实现基于HTTP文件传输的方法,以实例形式详细讲述了server端与client端的实现代码,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了Python实现基于H ...

  10. Socket实现文件传输

    Socket实现文件传输 1.客户端 通过new Socket("ip",port)连接服务端 创建文件输入流读取文件 创建返回套接字的输出流 写入文章名称,长度等属性 读取.写入 ...

最新文章

  1. Geoserver汉语版出来啦!!
  2. [Unity C#教程] 游戏对象和脚本
  3. python-爬虫(1)
  4. Centos7 把php5.4升级到php5.6
  5. python集合类型运算符_Python 数据类型和运算符
  6. Spring的4种事务管理(1种编程式事务+三种声明事务)
  7. concurrenthashmap_ConcurrentHashMap核心原理,这次彻底给整明白了
  8. [Python3] 010 字符串:给你们看看我的内置方法 第二弹
  9. WinEdt 参考文献格式
  10. Spark实现jieba中文分词(scala)
  11. GateWay 网关服务
  12. 【python】鞭炮快乐响,春联贴门上,祝福送到你身旁
  13. 计算机及处理器温度要求国标,【国家标准】GB 4967-1995电子计算器通用技术条件.pdf...
  14. cas的service管理
  15. Linux网络编程——socket、bind、listen、accpet、connect、read和write
  16. TikTok蝉联2021年8月全球热门移动应用下载榜冠军
  17. jdk8以上G1垃圾回收器的配置参数
  18. 蓝海卓越 计费管理系统 download.php 任意文件读取漏洞
  19. python必备源代码-Python 自用代码(某方标准类网页源代码清洗)
  20. 收支记录用这个记账本就够了

热门文章

  1. MatLab入门手册
  2. 瀑布开发模式和敏捷开发模式的区别和思考
  3. lpddr3 阻抗_lpddr3约束规则
  4. 安卓学习之持久化技术(数据库操作)
  5. Windchill二次开发-自定义文件编号(2)
  6. 计算机网络 TCP 滑动窗口协议 详解
  7. 【数据结构】链表:看我如何顺藤摸瓜
  8. H5调用用户摄像头并实现拍照功能
  9. 安卓开发学习之初识ndk开发
  10. spring源码阅读--aop实现原理分析