PYTHON——TCP&UDP:Socket实现文件上传

本文通过socket实现文件上传,需要说明:

1、本例待上传的文件与客户端程序fileupdate_client.py在同一路径下;

2、本例上传到服务端的文件,放在服务端程序fileupdate_server.py同一路径的文件夹'pic'内部。

3、本例上传的命令行格式为“post|filename.jpg”,例如,“ >>>post|thinkpad.jpg ”上传文件名为thinkpad.jpg的文件到服务端。

 

具体实现如下:

1、服务端程序:fileupdate_server.py

import socket
import subprocess
import time
import os
# subprocess.Popen() 重要方法.

# 学socket的秘籍:一收一发
sk = socket.socket()
host=''  #空表示本机,等效于127.0.0.1和localhost
port=8000
address = (host,port)
sk.bind(address)
sk.listen(3)
print('waiting......')
# conn,addr = sk.accept()  #这个conn是客户端的socket对象。非常重要。
buffersize=1024
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
    conn, addr = sk.accept()  # 这个conn是客户端的socket对象。非常重要。
    while True:
        data = conn.recv(buffersize)
        cmd,filename,filesize = str(data,'utf8').split('|') #客户端发过来的格式'post|%s|%s|'%(file_name,file_size)
        path = os.path.join(BASE_DIR,'pic',filename)  #join成绝对路径,保存图片
        filesize = int(filesize)

        has_recerve = 0
        f=open(path,'ab')
        while has_recerve!=filesize:
            data = conn.recv(buffersize)
            f.write(data)
            has_recerve += len(data)
        f.close()

conn.close()

2、客户端程序:fileupdate_client.py

import socket
import os

sk=socket.socket()
address = ('127.0.0.1',8000)
sk.connect(address)
buffersize=1024
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
    inp = input('>>>').strip()  #格式固定的命令:'post|文件路径',如post|11.jpg

    cmd_first,cmd_last = inp.split('|')  #cmd_last为上传的文件名
    print(cmd_last)
    path = os.path.join(BASE_DIR,cmd_last)  #文件绝对路径。#os.path.join()支持跨平台,推荐使用

    file_name = os.path.basename(path)  #取得文件名,如‘11.jpg’ = cmd_last
    file_size = os.stat(path).st_size  #获取文件大小的方法。
    file_info = 'post|%s|%s' %(file_name,file_size)
    sk.send(bytes(file_info,'utf8'))

    f = open(path,'rb')
    has_sent = 0
    while has_sent!=file_size:
        data = f.read(buffersize) #按指定大小从文件中读出数据
        sk.sendall(data)
        has_sent += len(data)
        # file_size -= buffersize
    f.close()
    print('上传成功')

sk.close()

 

转载于:https://www.cnblogs.com/chenhaiming/p/9888374.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值