• python基础实现tcp文件传输


    准备工作,实现文件上传需要那些工具呢?

      socket(传输)、open()(打开文件)、os(读取文件信息),当然还有辅助类sys和json,下面我们开始吧

    import socket,sys
    import json,os
    
    #创建socket对象
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #获取本地主机名
    host = socket.gethostname()
    
    #设置端口号
    port = 9000
    
    #绑定端口
    server.bind((host,port))
    
    #设置最大连接数
    server.listen(5)
    
    #建立连接
    while True:
        print('开始监听')
        #建立客户端连接
        clint,addr = server.accept()
        print("连接地址: %s" % str(addr))
        #接收文件属性数据,创建文件
        jsonObj = json.loads(clint.recv(1024).decode('utf-8'))
        print('接收到数据',jsonObj)
        if not jsonObj :
            os.mknod(jsonObj['name'])
        msg = json.dumps({'name':'消息','信号':'创建成功'})
        #回数据确认已经建立新文件
        clint.send(msg.encode('utf-8'))
        #接收数据
        size = 0
        sizeValue = int(jsonObj['size'])
        print('开始接收数据')
        with open(jsonObj['name'], 'wb') as file:
            while size < sizeValue:
                value = sizeValue - size
                if value >1024:
                    getdate = clint.recv(1024)
                else :
                    getdate = clint.recv(value)
                file.write(getdate)
                size += 1024
        print('结束')
        #关闭连接
        clint.close()

    客户端

    '''发送文件
    Usage:
    clint.py <name> [<rename>]
    
    '''
    import socket
    import os,json,sys
    
    #建立json数据,包含文件名以及大小
    #{name:name,size:99999}
    date = {}
    if len(sys.argv) == 2:
        print(type(sys.argv[1]))
        name = sys.argv[1].split('\')[-1]
        date['name'] = name
    else:
        date['name'] = sys.argv[2]
    date['size'] = os.path.getsize(sys.argv[1])
    jsonString = json.dumps(date).encode('utf-8')
    
    #create connection
    clint = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 获取本地主机名
    host = socket.gethostname()
    # 设置端口好
    port = 9000
    # 连接服务,指定主机和端口
    clint.connect((host, port))
    #发送文件属性信息
    clint.send(jsonString)
    #接收服务端发过来的确认信息
    clint.recv(1024)
    #发送文件数据
    size = 0
    with open(sys.argv[1],'rb') as file:
        while size < date['size']:
            fileDate = file.read(1024)
            clint.send(fileDate)
            size += 1024
    #关闭连接
    clint.close()
  • 相关阅读:
    [备忘]使用Outlook 2010,拖拽大于20M附件发生“附件大小超过了允许的范围”提示的解决方法
    关于Linq to SQL 的“异常详细信息: System.InvalidCastException: 指定的转换无效。”
    [备忘]ie6中href设为javascript:void(0)页面无法提交的解决方法
    [备忘]谷歌员工证实PR值不再更新 呼吁用户关注内容
    今天早上
    C++primer6.20
    Fuzzy KNN
    数值转换
    ArcMap分割图斑
    VS2008 集成openCV过程
  • 原文地址:https://www.cnblogs.com/hardykay/p/10683394.html
Copyright © 2020-2023  润新知