zoukankan      html  css  js  c++  java
  • Python学习——socket模块ftp传输文件

    使用环境:python3,window环境,需要在头部声明# -*- coding:utf-8 -*-

    实现功能:

    将sever端所处文件夹的文件,传输到client端所处的文件夹中。

    并且通过md5检测是否出错。

    客户端命令的形式是: get 文件名

    client处的新文件是 文件名.new

    ftp_sever.py

     1 import hashlib
     2 import socket ,os,time
     3 server = socket.socket()
     4 server.bind(('localhost',9999))
     5 server.listen()
     6 while True:
     7     print("I am waiting for connection.")
     8     conn, addr = server.accept()
     9     print("new conn:",addr)
    10     while True:
    11         print("等待新指令")
    12         data = conn.recv(1024)
    13         if not data:
    14             print("客户端已断开")
    15             break
    16         cmd,filename = data.decode().split()
    17         print(filename)
    18         if os.path.isfile(filename):   #判断是否该文件名为文件
    19            f = open(filename,"rb")
    20            m = hashlib.md5()  #为md5准备
    21            file_size = os.stat(filename).st_size  #利用os.stat获取文件的大小
    22            conn.send( str(file_size).encode() ) #send file size
    23            conn.recv(1024) #等待确认,同时可以防止粘包。
    24            for line in f: #一行一行发送数据,同时更新md5
    25               m.update(line)   #不断更新md5
    26               conn.send(line)  #不断发送数据。
    27            print("file md5", m.hexdigest())  #十六进制的md5
    28            f.close()
    29            conn.send(m.hexdigest().encode()) #send md5
    30         print("send done")
    31 
    32 server.close()

    ftp_client.py

     1 import socket
     2 import hashlib
     3 
     4 client = socket.socket()
     5 
     6 client.connect(('localhost', 9999))
     7 
     8 while True:
     9     cmd = input(">>:").strip() #形式 get filename
    10     if len(cmd) == 0: continue
    11     if cmd.startswith("get"):
    12         client.send(cmd.encode()) #发送命令,形式 get filename
    13         server_response = client.recv(1024) #接收文件大小信息
    14         print("servr response:", server_response)
    15         client.send(b"ready to recv file")  #发送确认信息。
    16         file_total_size = int(server_response.decode()) #将文件大小int化。
    17         received_size = 0  #初始化接收数据大小,为0
    18         filename = cmd.split()[1]  #获取文件名
    19         f = open(filename + ".new", "wb") #以二进制形式写入
    20         m = hashlib.md5()  #为md5准备
    21 
    22         while received_size != file_total_size:
    '''下面的if判断是用来完整接收文件,从而避免粘包。'''
    23 if file_total_size - received_size > 1024: # 要收不止一次 24 size = 1024 25 else: # 最后一次了,剩多少收多少 26 size = file_total_size - received_size 27 print("last receive:", size) 28 data = client.recv(size) #data只需要是一小个内存,大小为1k就好 29 received_size += len(data) 30 m.update(data) #不断更新md5 31 f.write(data) #不断写入 32 # print(file_total_size,received_size) 33 else: 34 new_file_md5 = m.hexdigest() #获取十六进制的md5 35 print("file recv done", received_size, file_total_size) 36  f.close() 37 server_file_md5 = client.recv(1024) #接收md5值 38 print("server file md5:", server_file_md5) 39 print("client file md5:", new_file_md5) 40 41 client.close()
  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/Ian-learning/p/8460211.html
Copyright © 2011-2022 走看看