首页 > 解决方案 > 接收文件并将它们保存在套接字 Python 上

问题描述

我的服务器正在发送名称为 file_1、file_2 等的一系列文件。发送套接字运行良好,我检查了这些文件是否正确。

服务器- 发送文件

f = open(new_filename, 'rb')
            start_ts = ts
            seconds += 1
            try:
                print('Sending %s' % new_filename)
                conn.sendall(f.read(99999999))
                f.flush()
                f.close()
            except socket.error:
                if errno == errno.ECONNREFUSED:
                    print(os.strerror(socket.error.errno))
                else:
                    raise
                print('Send failed')
                sys.exit()

在客户端,我想接收这些文件并将它们保存为我计算机上服务器上的方式(save_1,save_2,...)。

客户端- 接收文件并尝试保存它们

try:
        client.send(b'Receiving Data...\n')
        while True:
            save_filename = 'savefolder/save_%i.pcap' % file_index
            f = open(save_filename, 'wb')
            data = client.recv(99999999)
            f.write(data)
            reply = b'Message Received.\n'
            if not data:
                break
            client.sendall(reply)
            f.close()
            file_index += 1
    except socket.timeout:
        print('Done receiving.', end=' ')
        client.close()
        print('Client socket is closed')
  1. 但是保存的文件看起来很奇怪。当服务器发送一个 3,755 KB 的文件时,客户端写入两个 192 KB 和 3,563 KB 的文件。更糟糕的是,更大的一个崩溃。有解决办法吗?我不知道为什么我的代码会发生这种情况。
  2. 是否只有输入 99999999 值才能获得整个文件而不切割?
  3. 为什么即使我在那里写了一些代码,我的客户端也不向服务器发送消息?

标签: pythonsocketsserverclient

解决方案


TCP 不是基于消息的协议,而是字节流协议。send使用 读取多少或sendall读取多少之间没有固定的关系recv

为了通过同一连接发送多个消息(文件),您必须定义一些应用程序协议,该协议清楚地定义消息的开始和结束位置。另一种方法是为每个文件使用一个新的 TCP 连接并读取直到recv返回'',即表示另一个站点已关闭连接。


推荐阅读