2014-11-11 2 views
0

Я новичок в python и английском :). Я пытаюсь отправить файл изображения usşng python сокеты, и я написал это сокровища. он говорит, что он работает, но я получаю пустой файл или отсутствующий файл изображения. это коды, которые я написал:отправка изображений с использованием python tcp socket

сервер:

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() 

ответ

2

По умолчанию функция Python open открывает файл в текстовом режиме , что означает, что он будет обрабатывать все входные/выходные данные как текст, тогда как изображение определено двоичный код.

Файл в текстовом режиме будет делать нечто вроде перевода строк новой строки (которые различаются в разных системах). Это означает, что данные, которые вы читаете, будут повреждены.

Чтобы открыть файл в двоичном режиме, добавьте 'b' к флагам режима, например, например.

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

Однако, с кодом это приводит к другой проблеме, а именно, что вы не можете использовать readline больше. Не то, чтобы это имело большой смысл, читая двоичные данные в виде строк, поскольку в двоичных данных нет «строк».

Вместо этого вы должны использовать функцию read.