python-->上传与下载文件详解

简介:

宇晖关于客户端与服务端关于上传下载文件的总结:

1,首先分别,创建一个函数:,用来创建客户端与服务端。

服务端:

server = socket.socket()

server.bind(('localhost',9999))

客户端:

client = socket.socket()

client.connect(('localhost', 9999))

这个是固定格式,基础中的基础,在python中相当于1+1等于几。

2,然后让服务端不断地接受多个客户端

while True:

server.listen()

conn, addr = server.accept()

    print("new addr:",addr)

套接字与地址,需要尤为注意。

3,让服务端不断地接受来自客户端的消息。

    while True:

            data = conn.recv(1024)

            Print(data)

            if not data:

                print("客户端已断开。。。")

                Break

4,通过发送消息,确认两者连接无误后,服务端开始接受来自客户端的消息

            cmd, filename = data.decode().split()

            print(filename)

 

5,通过判断cmd,来寻求客户端是上传还是下载

           if cmd == 'get':

                get(filename,conn)

            elif cmd == 'put':

                put(filename,conn)

            elif cmd == 'ls':

                ls(filename,conn)

6,紧接着,还有最最最重要的是,不要忘记关闭

server.close()

 

 

 

 

 

 

 

 

 

7,修饰客户端,不断发送消息,

while True:

msg = input(">>:").strip()

if len(msg) == 0:

       continue

client.send(msg.encode())

8,自身不断地对自身的消息进行处理判断是调用哪个函数

    cmd,filename = msg.split()

        if cmd == 'get':

            get(filename,client)

        elif cmd == 'put':

            put(filename,client)

        else:

            ls(filename,client)

client.close()#注意关闭客户端

好了,这是第一部分,我们需要写的函数,用来上传和下载

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

现开始第二部分的学习,进行文件的发送,和接受,先来看服务端

1,服务端收到信息之后,首先要的判断文件存不存在,如果存在才能继续进行后面操作,

def get(filename,conn):

    if os.path.isfile(filename):

2,接着都是套路了

f = open(filename, "rb")

        m = hashlib.md5()

        file_size = os.stat(filename).st_size

        conn.send((str(file_size)).encode())

        conn.recv(1024)

        for line in f:

            m.update(line)

            conn.send(line)

        f.close()

        print("md5:", m.hexdigest())  

3,接着判断客户端

def get(filename,client):

    ser_respondse = client.recv(1024)

    client.send("准备好了接收".encode())

4,按照上节知识点,套路继续

if ser_respondse.decode()!= '0':

        file_size = int(ser_respondse.decode())

        f = open(filename + '_new.txt', "wb")

re_size = 0

        cm = hashlib.md5()

        while re_size < file_size:

            if file_size - re_size > 1024:

                size = 1024

            else:

                print("the last size:",size)

                data = client.recv(size)

                recv_size += len(data)

                f.write(data)

                m.update(data)

这是下载文件的原理,又继续重复了一遍,

 下面是源代码

服务端

import socket,os,hashlib,time,json
def get(filename,conn):
   if os.path.isfile(filename):
       f = open(filename, "rb")
       m = hashlib.md5()
       file_size = os.stat(filename).st_size
       conn.send((str(file_size)).encode())
       conn.recv(1024)
       for line in f:
           m.update(line)
           conn.send(line)
       f.close()
       print("md5:", m.hexdigest())
       time.sleep(0.5)
       conn.send(m.hexdigest().encode())
       print("send done")
   else:
       conn.send('0'.encode())
def put(filename,conn):
   f = open(filename+'1','wb')
   send_size = conn.recv(1024)
   lm=0
   file_size = int(send_size.decode())
   re_size = 0
   conn.send("dsd".encode())
   cm = hashlib.md5()
   while re_size < file_size:
       if file_size - re_size > 1024:
           size = 1024
       else:
           size = file_size - re_size
       lm=lm+size
       data = conn.recv(size)
       re_size += len(data)
       f.write(data)
       cm.update(data)
       conn.send(str(lm).encode())
   conn.send(cm.hexdigest().encode())
   print("recv over..")
   f.close()
def main():
   server = socket.socket()
   server.bind(('localhost', 9999))
   while True:
       server.listen()
       conn,addr = server.accept()
       print("addr:",addr)
       while True:
           data = conn.recv(1024)
           print(data)
           if not data:
               print("客户端已断开")
               break
           cmd,filename = data.decode().split()
           if cmd == 'get':
               get(filename,conn)
           elif cmd == 'put':
               put(filename,conn)
   server.close()

if __name__ == '__main__':
   main()



客户端:

import socket,os,hashlib,time,json

def get(filename,client):
   ser_respondse = client.recv(1024)
   client.send("准备好了接收".encode())
   if ser_respondse.decode()!= '0':
       file_size = int(ser_respondse.decode())
       f = open(filename + '_jjjjnew.txt', "wb")
       re_size = 0
       cm = hashlib.md5()
       while re_size < file_size:
           if file_size - re_size > 1024:
               size = 1024
           else:
               size = file_size - re_size
               print("the last size:", size)
           data = client.recv(size)
           re_size += len(data)
           f.write(data)
           cm.update(data)
       else:
           client_md5 = cm.hexdigest()
           print("文件已下载完毕啦啦啦")
           print("total size:", file_size, "had been received:",re_size)
           server_md5 = client.recv(1024)
           print("server md5:", client_md5, "server md5:", server_md5.decode())
           f.close()
       # #client.send("dsds".encode())
       # sm = client.recv(1024)
       # if cm.hexdigest() == sm.decode():
       #     print("load success")
       # f.close()
   # else:
   #     print("no this file..")
def put(filename,client):
   f = open(filename, "rb")
   m = hashlib.md5()
   file_size = os.stat(filename).st_size
   client.send((str(file_size)).encode())
   client.recv(1024)
   for line in f:
       m.update(line)
       client.send(line)
       size=client.recv(1024)
       print("文件已上传了:", size.decode())
   f.close()
   time.sleep(0.5)
   server_md5 = client.recv(1024)
   client_md5 = m.hexdigest()
   print("server md5:", client_md5, "server md5:", server_md5.decode())
   print("文件上传成功了")

def main():
   client = socket.socket()
   client.connect(('localhost', 9999))
   while True:
       msg = input(">>:").strip()
       if len(msg) == 0:
           continue
       client.send(msg.encode())
       cmd,filename = msg.split()
       if cmd == 'get':
           get(filename,client)
       elif cmd == 'put':
           put(filename,client)
   client.close()

if __name__ == '__main__':

   main()

就这样吧,累了,玩一会儿嘛


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       本文转自眉间雪 51CTO博客,原文链接:http://blog.51cto.com/13348847/1982892,如需转载请自行联系原作者


 

 

 

 

 

 

 

相关文章
|
22天前
|
Python
【python】python跨文件使用全局变量
【python】python跨文件使用全局变量
|
30天前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
22 1
|
1月前
|
存储 并行计算 Java
Python读取.nc文件的方法与技术详解
本文介绍了Python中读取.nc(NetCDF)文件的两种方法:使用netCDF4和xarray库。netCDF4库通过`Dataset`函数打开文件,`variables`属性获取变量,再通过字典键读取数据。xarray库利用`open_dataset`打开文件,直接通过变量名访问数据。文中还涉及性能优化,如分块读取、使用Dask进行并行计算以及仅加载所需变量。注意文件路径、变量命名和数据类型,读取后记得关闭文件(netCDF4需显式关闭)。随着科学数据的增长,掌握高效处理.nc文件的技能至关重要。
139 0
|
1月前
|
Python
python中文件和异常处理方法(二)
python中文件和异常处理方法(二)
13 0
|
1月前
|
Python
python中文件和异常处理方法(一)
python中文件和异常处理方法(一)
29 0
|
1月前
|
Python
python中文件和异常处理方法(三)
python中文件和异常处理方法(三)
20 0
|
5天前
|
存储 Python
用Python实现批量下载文件——代理ip排除万难
用Python实现批量下载文件——代理ip排除万难
|
6天前
|
JSON 关系型数据库 数据库
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
33 0
|
6天前
|
数据挖掘 索引 Python
Python 读写 Excel 文件
Python 读写 Excel 文件
11 0
|
6天前
|
数据安全/隐私保护 Python
Python文件与目录操作:面试中的高频考点
【4月更文挑战第15天】本文介绍了Python文件和目录操作的面试重点,包括文件的读写、目录遍历及权限管理。强调了文件关闭、异常处理、特殊文件判断以及权限位和权限字符串的理解。提供了代码示例,如读写文件、遍历目录和更改文件权限,帮助读者在面试中表现出色。掌握这些技能将对编程求职之路大有裨益。
17 0