当前位置: 首页 > news >正文

通过socket实现文件上传和下载功能

1 背景说明

使用 Python 的 socket 模块可以实现简单的文件上传和下载功能,可支持文件、图片上传。

2 服务器端代码 (socket_fileupload_server.py)

服务器端负责接收客户端发送的文件并保存。

import socket
from datetime import datetime


def file_upload_server(host='127.0.0.1', port=12345, max_listen=5):
    """
    定义一个文件上传服务器
    :param host: IP地址,默认127.0.0.1
    :param port: 端口,默认8080
    :param max_listen: 最大监听数,默认5
    :return: 无
    """
    # 创建 socket 对象,采用IP4、字节流(tcp)进行通信
    socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定地址和端口
    socket_server.bind((host, port))
    # 设置最大监听数
    socket_server.listen(max_listen)
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 服务器启动,等待连接……')

    # 接受客户端连接
    client_socket, client_address = socket_server.accept()
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 连接来自:{client_address}')

    # 接收文件名称
    file_name = client_socket.recv(1024).decode('utf-8')
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 接收文件名称为:{file_name}')

    # 接收文件数据
    with open(file_name, 'wb') as f:
        # 循环接收数据
        while True:
            # 获取数据,每次最大为1024B
            data = client_socket.recv(1024)
            # 如果接收数据为空,则跳出循环
            if not data:
                break
            # 将接收的数据写入到文件
            f.write(data)

    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 文件 {file_name} 接收完成!')

    # 关闭客户端连接
    client_socket.close()
    # 关闭服务器连接
    socket_server.close()
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 服务器已关闭')


if __name__ == '__main__':
    # 启动文件上传服务区器
    file_upload_server()

3 客户端代码 (socket_fileupload_client.py)

客户端负责读取本地文件并将其发送到服务器。

import socket
from datetime import datetime


def file_upload_client(file_path, host='127.0.0.1', port=12345):
    """
    定义一个文件上传客户端
    :param file_path: 文件路径信息,格式为:d:/files/test.txt
    :param host: IP地址,默认127.0.0.1
    :param port: 端口,默认8080
    :return:无
    """
    # 创建 socket 对象,采用IP4、字节流(tcp)进行通信
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    client_socket.connect((host, port))
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 服务器连接成功!')

    # 获取文件名,支持文件路径:d:/files/test.txt
    file_name = file_path.split('/')[-1]
    # 将文件名发送给服务器
    client_socket.send(file_name.encode('utf-8'))
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 上传文件名为:{file_name}')

    # 读取文件名
    with open(file_path, 'rb') as f:
        # 循环读取文件信息并发送
        while True:
            # 获取数据,每次最大为1024B
            data = f.read(1024)
            # 如果接收数据为空,则跳出循环
            if not data:
                break
            # 将读取的数据发送给服务器
            client_socket.send(data)
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 文件 {file_name} 发送完成!')

    # 关闭连接
    client_socket.close()
    print(f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] 客户端已关闭')


if __name__ == '__main__':
    # file_img_path = 'F:/Pictures/桌面.jpg'
    # file_upload_client(file_img_path)
    file_path = 'F:/Documents/测试文档.txt'
    file_upload_client(file_path)

相关文章:

  • 信息系统运行管理员教程5--信息系统数据资源维护
  • PAT甲级(Advanced Level) Practice 1023 Have Fun with Numbers
  • LeetCode 1005. K 次取反后最大化的数组和 java题解
  • C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)
  • SpringBoot3+Druid+MybatisPlus多数据源支持,通过@DS注解配置Service/Mapper/Entity使用什么数据源
  • Windows11 新机开荒(二)电脑优化设置
  • C++ 类和对象 友元 内部类 this指针 默认成员函数 初始化列表……
  • Pandas DataFrame:数据分析的利器
  • 14 结构体
  • WebSocket和长轮询
  • 【操作系统】Ch6 文件系统
  • 【最后203篇系列】015 几种消息队列的思考
  • ORA-00600错误的深度剖析:如何避免与解决?
  • 蓝桥杯宝石,考察数学。考察公式推导能力
  • 设计模式(行为型)-命令模式
  • 【MySQL】MySQL数据存储机制之存储引擎
  • Vim 编辑器-实现基础跳转
  • MCP 开放协议
  • 55-交换机堆叠
  • P4924 [1007] 魔法少女小Scarlet
  • 最美西游、三星堆遗址等入选“2025十大年度IP”
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人
  • 宝妈称宝宝在粽子中吃出带血创可贴,来伊份:已内部排查
  • ​中国超大规模市场是信心所在——海南自贸港建设一线观察
  • 跨越时空的“精神返乡”,叶灵凤藏书票捐赠上海文学馆
  • 巴基斯坦外长:近期军事回应是自卫措施