使用Python发送文件和文件名

使用Python发送文件和文件名,python,sockets,Python,Sockets,我想制作一个简单的服务器,从客户端接收不同类型的文件。问题是,我无法从客户端获得发送过来的文件名,因此所有文件都保存为1个文件名,无论文件名是什么 这是我的客户。py: import socket with socket.socket() as s: s.connect(('192.168.1.2',10000)) with open('Image.jpg','rb') as f: s.sendall(f.read()) 这是我的server.py: impor

我想制作一个简单的服务器,从客户端接收不同类型的文件。问题是,我无法从客户端获得发送过来的文件名,因此所有文件都保存为1个文件名,无论文件名是什么

这是我的客户。py:

import socket
with socket.socket() as s:
    s.connect(('192.168.1.2',10000))
    with open('Image.jpg','rb') as f:
        s.sendall(f.read())
这是我的server.py:

import socket
print("Server started")
while True:
        with socket.socket() as s:
            s.bind(('192.168.1.2',10000))
            s.listen(1)
            with s.accept()[0] as c:
                chunks = []
                while True:
                    chunk = c.recv(4096)
                    if not chunk: break
                    chunks.append(chunk)
                    print("Receiving file")
            with open('Image.jpg','wb') as f:
                f.write(b''.join(chunks))
                print("File Received")
这很好用。问题开始了,如果我发送另一个文件,例如“data.csv”,它仍然会在服务器上保存为“Image.jpg”


是否有办法将文件名与文件一起保存?

我通常会在数据之前发送文件名:

import socket
print("Server started")
while True:
        with socket.socket() as s:
            s.bind(('192.168.1.2',10000))
            s.listen(1)
            with s.accept()[0] as c:
                chunks = []
                while True:
                    filename = c.recv(1600)
                    filename = filename.decode()
                    chunk = c.recv(4096)
                    if not chunk: break
                    chunks.append(chunk)
                    print("Receiving file")
            with open(filename,'wb') as f:
                f.write(b''.join(chunks))
                print("File Received")
客户:

import socket
import time
with socket.socket() as s:
    s.connect(('192.168.1.2',10000))
    with open('Image.jpg','rb') as f:
        s.sendall('Image.jpg'.encode())
        time.sleep(3)
        s.sendall(f.read())

也许您可以将其作为标题或图片前的消息?现在以明文发送文件不是一个好主意,您是否考虑过使用
scp
?您需要创建一个有线协议,允许您包含文件名(或使用一个已经可以这样做的协议,例如ftp…)