0

我是python和英语的新手:)。我正在尝试发送一个图像文件 usşng python sockets,我已经写了这个 cosdes。它说它可以工作,但我得到一个空文件或缺少图像文件。这是我写的代码:

服务器:

import socket


host = socket.gethostname()

port = 5000

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

s.bind((host, port))

s.listen(1)

sunucu , adres = s.accept()

print "baglanti saglandi"

def recvall(baglanti, buf):

    data = ""
    while len(data) < buf:

        packet = baglanti.recv(buf - len(data))

        if not packet:

            return None

        data += packet

    return data


f = open("ggg.png", "w")

while True:

    veri = sunucu.recv(512)

    if not veri:

        break

    f.write(veri)

f.close()

print "resim alindi."


sunucu.close()

s.close()

和客户:

import socket


host = socket.gethostname()

port = 5000

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

s.connect((host , port))



f = open("ornekresim.png", "r")

while True:

    veri = f.readline(512)

    if not veri:

        break

    s.send(veri)

f.close()

print "resim gonderildi"

s.close()
4

1 回答 1

2

默认情况下,Python 函数以文本open模式打开文件,这意味着它将所有输入/输出作为text处理,而图像绝对是binary

文本模式下的文件将执行诸如翻译换行序列(在不同系统上不同)之类的操作。这意味着您读取的数据将被损坏。

要以二进制模式打开文件,然后附加'b'到模式标志,例如

f = open("ornekresim.png", "rb")  # <-- Note the 'b' in the mode

但是,对于您的代码,这会导致另一个问题,即您不能再使用readline了。无论如何,由于二进制数据中没有“行”,因此将二进制数据作为行读取并不是很有意义。

您必须改用该read功能。

于 2014-11-11T16:02:28.057 回答