zoukankan      html  css  js  c++  java
  • python简单的ftp程序

    服务器端

    '''
    1.读取文件名
    2.检测文件是否存在
    3.打开文件
    4.检测文件大小
    5.发送文件大小给客户端
    6.等客户端确认
    7.开始边读边发数据
    8.发送md5
    '''
    import socket,os,time,hashlib
    server=socket.socket()
    server.bind(('0.0.0.0',9999))
    server.listen()

    while True:
    conn, addr = server.accept()
    print("new conn:",addr)
    # print("recv:%s" % data)
    while True:
    print("等待新指令:")
    data = conn.recv(10240)#[1]收到的是比特流
    if not data:
    print("客户端已断开")
    break
    cmd, filename = data.decode().split()#比特流解码之后按照空格分割成"命令,文件名"
    print("文件名:", filename)
    if os.path.isfile(filename):#判断文件名是否存在
    f = open (filename, 'rb')
    m = hashlib.md5()
    file_size = os.stat(filename).st_size
    #print(type(file_size)) #int
    conn.send (str (file_size).encode ()) # [2]发送文件大小
    print("[服务器发送的文件大小]",str(file_size).encode())
    conn.send(str(file_size).encode())#[2]发送文件大小
    #conn.send(str(len(file_size.encode())).encode("utf-8")) # 发送文件大小
    #conn.send(file_size.encode())
    conn.recv(1024)#等待ack[3]
    # for line in f:
    for line in f:
    m.update(line)
    #line = f.readline(1024)
    conn.send(line) # [4]服务器端一行一行发送
    print("发送的数据:",line.decode())
    print("文件md5值",m.hexdigest())
    #conn.send(m.hexdigest().encode())#[4]发送md5
    f.close()
    print("send done")

    server.close()


    客户端
    import socket,os,sys,hashlib

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

    while True:
    cmd = input("input the filename>>>").strip()
    if len(cmd)== 0: continue
    if cmd.startswith("get"):#以'get'开头才行
    client.send(cmd.encode())#[1]输入的是字符串.实际发送的是比特流
    server_response=client.recv(1024)#[2]客户端收到来自服务器发送的文件的大小
    print("[server_response]文件大小:",server_response)
    client.send(b"ready to accept......")#[3]
    file_total_size=int(server_response.decode())#因为收到来自服务器的是个比特流,所以要先解码,完了之后将其变成整数,方便下面的比较
    print("[file_total_size]:",file_total_size)
    received_size=0
    # received_data=b''
    filename=cmd.split()[1]
    f=open(filename+".new","wb")
    m=hashlib.md5()
    while received_size != file_total_size:
    data=client.recv(1024)#[4]客户端收到数据
    received_size += len (data) # 每次收到的有可能小于1024,所以必须用len判断
    print ("文件总大小:%s,已收到文件大小:%s" % (file_total_size, received_size))
    f.write(data)
    print("data类型:",type(data))
    print("data.decode类型:",type(data.decode()))#收到的数据解码之后是字符类型
    print("当前文件大小",len(data.decode()))
    #received_data+=data
    m.update(data)
    #print(data.decode())
    else:
    new_file_md5=m.hexdigest()
    print("cmd res raceive done...",received_size)
    f.close()
    # server_file_md5=client.recv(1024)
    # print("server file md5:",server_file_md5)
    # print("client file md5",new_file_md5)

    client.close()
  • 相关阅读:
    关于网购心态
    c++ In STL maps, is it better to use map::insert than []? Stack Overflow
    小工具:sshcopyid_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间
    djangoqbe
    C++ STL map的使用
    容器find_if函数定义和其第三个参数重载的疑问
    ArchLinux的安装与配置
    使用Grub进行Linux的硬盘安装与修复
    MySQL数据类型简介
    ArchLinux下Alsa的简单配置
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/7756391.html
Copyright © 2011-2022 走看看