ftp server 传送文件

操作步骤:

1、读取文件名

2、文件是否存在

3、打开文件

4、读取文件大小

5、准备发送文件到客户端

6、等客户端确认,防止发生粘包

7、发送数据

8、md5校验

客户端

import socket
import hashlib

client = socket.socket()
client.connect(("localhost", 9999))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0: continue
    if cmd.startswith("get"):
        client.send(cmd.encode("utf-8"))  # 发送1
        data_size = client.recv(1024)  # 接收2 文件大小
        print("接收的文件大小为:", data_size)
        client.send("准备好了".encode("utf-8"))  # 发送3 发送确认
        filename = cmd.split()[1]
        recived_size = 0
        m = hashlib.md5()
        with open(filename + ".new", "wb") as f:
            while recived_size < int(data_size.decode()):
                if int(data_size.decode()) - recived_size > 1024:#防止粘包
                    size = 1024
                else:
                    size = int(data_size.decode()) - recived_size
                    print(size)
                recived_data = client.recv(size)  # 接收4 接收文件
                f.write(recived_data)
                m.update(recived_data)
                recived_data_size = len(recived_data)
                recived_size += recived_data_size
            else:
                server_md5 = client.recv(1024)
                print("来自服务器文件的MD5", server_md5.decode())
                client_md5 = m.hexdigest()
                print("接受后的文件的MD5", client_md5)
                print("接收完毕")
                print("接收到文件数据大小:", recived_size, "/", int(data_size.decode()))
client.close()


服务端

扫描二维码关注公众号,回复: 3211592 查看本文章
import os, socket
import hashlib

server = socket.socket()
server.bind(("localhost", 9999))
server.listen()
print("正在监听")
while True:
    conn, address = server.accept()
    print("新的会话", address)
    while True:
        print("等待新指令")
        data = conn.recv(1024)  # 接收1
        if not data:
            print("客户端已断开")
            break
        cmd, filename = data.decode().split()
        if os.path.isfile(filename):
            with open(filename, "rb") as f:
                file_data_size = os.stat(filename).st_size
                print("发送的文件大小为:", file_data_size)
                conn.send(str(file_data_size).encode("utf-8"))  # 发送2 文件大小
                client_ack = conn.recv(1024)  # 接收3 接收确认
                m = hashlib.md5()
                for line in f:
                    conn.send(line)  # 发送4 文件内容
                    m.update(line)
                conn.send(m.hexdigest().encode("utf-8"))
                print("md5值为:",m.hexdigest())
        print("发送完毕")
server.close()

客户端如图所示

>>:get ThunderVIP-jsb.exe
接收的文件大小为: b'26659288'
764
来自服务器文件的MD5 c9ccdae767ebccd4b3f86ff3506c16ba
接受后的文件的MD5 c9ccdae767ebccd4b3f86ff3506c16ba
接收完毕
接收到文件数据大小: 26659288 / 26659288

>>:

服务端

正在监听
新的会话 ('127.0.0.1', 56787)
等待新指令
发送的文件大小为: 26659288
md5值为: c9ccdae767ebccd4b3f86ff3506c16ba
发送完毕

等待新指令


猜你喜欢

转载自blog.csdn.net/u014248032/article/details/80856434
今日推荐