使用python套接字将文件名从客户端发送到服务器

使用python套接字将文件名从客户端发送到服务器,python,web-services,sockets,websocket,Python,Web Services,Sockets,Websocket,在我的代码中,我将一个图像从客户端发送到服务器。一切都很好,但当我尝试将图像的文件名从服务器发送到客户端时,我一直在等待,没有收到任何错误。 这是我的密码: 客户: import socket import pickle host = socket.gethostname() port = 5000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host , port)) f = open("te

在我的代码中,我将一个图像从客户端发送到服务器。一切都很好,但当我尝试将图像的文件名从服务器发送到客户端时,我一直在等待,没有收到任何错误。 这是我的密码:

客户:

import socket
import pickle


host = socket.gethostname()

port = 5000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host , port))



f = open("test.png", "rb")

while True:

    veri = f.read()

    if not veri:

        break

    s.send(veri)

f.close()

print "image successfully sent"




data = s.recv(1024)
#data_arr=pickle.loads(data)

print "data recieved is :",data


s.close()
服务器:

import socket
import pickle
from PIL import Image
import os


host = socket.gethostname()

port = 5000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

s.bind((host, port))

s.listen(5)

client , adress = s.accept()

print "successfully connected to",adress

f = open("server.png", "wb")

while True:

    veri = client.recv(1024)

    if not veri:

        break

    f.write(veri)

f.close()

print "image recieved successfully"


T= os.path.abspath(f.name)

print "the path of the image is ",T

#data=pickle.dumps(T)
client.send(T)
print "binary data sent"

client.close()

由于使用了相同的通道,我认为在读取图像数据时会读取文件名。用十六进制编辑器检查png文件(结尾)以确认这一点。您必须首先发送图像的大小,以便只读取所需的字节,这样它就不会读取包含其余数据的文件名。我认为这个问题与文件名无关,我尝试了client.send(str(9))我得到了同样的结果,你必须以二进制的形式发送大小(如果大小固定的话),然后读取相同数量的字节来获得另一端的大小。然后您就知道要为图像和文件名读取多少字节。首先发送包含大小的“标题”,然后发送数据,以便接收者知道每个对象要读取多少数据。