Отправить изображение с помощью программирования сокетов Python
Я пытаюсь отправить файл изображения с помощью программирования сокетов в python. Я могу отправить текстовый файл. Но я пытаюсь отправить файл изображения, открыв его и прочитав содержимое файла изображения в строке, а затем посылая строку и получая ее на стороне клиента, а затем записывая ее в файл с тем же именем в другой каталог, но я не могу открыть файл. Также я размещаю свой код ниже, прокомментированные части являются признаком того, что я уже пробовал это. Также возникают проблемы с отправкой целого числа size
, но я получаю некоторую случайную строку с другой стороны.
Это сервер script
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5000))
server_socket.listen(5)
import os
client_socket, address = server_socket.accept()
print "Conencted to - ",address,"\n"
while (1):
choice = client_socket.recv(1024)
choice = int(choice)
if(choice == 1):
data = client_socket.recv(1024)
print "The following data was received - ",data
print "Opening file - ",data
fp = open(data,'r')
strng = fp.read()
size = os.path.getsize(data)
size = str(size)
client_socket.send(size)
client_socket.send (strng)
#client_socket.close()
if (choice == 2):
data = client_socket.recv(1024)
print "The following data was received - ",data
print "Opening file - ",data
fp = open(data,'r')
strng = fp.read()
#strng = str(fp)
size = os.path.getsize(data)
print size
size = str(size)
print size
client_socket.send(size)
client_socket.send (strng)
#client_socket.close()
И это клиентская сторона script -
#!/usr/bin/python
# TCP client example
import socket,os
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("", 5000))
k = ' '
size = 1024
while(1):
print "Do you want to transfer a \n1.Text File\n2.Image\n3.Video\n"
k = raw_input()
client_socket.send(k)
k = int (k)
if(k == 1):
print "Enter file name\n"
strng = raw_input()
client_socket.send(strng)
size = client_socket.recv(1024)
size = int(size)
print "The file size is - ",size," bytes"
size = size*2
strng = client_socket.recv(size)
print "\nThe contents of that file - "
print strng
if (k==2):
print "Enter file name of the image with extentsion (example: filename.jpg,filename.png) - "
fname = raw_input()
client_socket.send(fname)
size = client_socket.recv(1)
print size
#size = int(size)
print "The file size is - ",size
size = size*2
strng = client_socket.recv(256456)
print "\nThe file will be saved and opened- "
fname = 'downloads/'+fname
nf = open(fname,'w')
nf.write(strng)
nf.close()
fname = 'viewnior '+ fname
print fname
os.system(fname)
Я программирую на Crunchbang Linux - Неофициальный Debian, основанный на Distro
viewnior - просмотрщик изображений.
Ответы
Ответ 1
Я запустил тот же код в своей системе (Ubuntu 11.10), и я обнаружил, что существует проблема с отправкой размера в виде строки. Когда я вставил логику для обработки этой части, она прошла гладко. Я мог бы открыть файл.
Вот как я мог решить вашу проблему:
Первое изменение в клиентском коде (client.py) происходит при принятии размера и отправке подтверждения о нем: -
size = ' '
while(1):
tmpsize = client_socket.recv(1)
if tmpsize.isdigit() == True:
print "Here : ",tmpsize
size += tmpsize
else:
break
client_socket.send("received")
Второе изменение - на стороне сервера (server.py), чтобы принять подтверждение: -
client_socket.send(size)
ack = client_socket.recv(1024)
if ack == "received":
client_socket.send (strng)
Я надеюсь, что это поможет вам решить вашу проблему.
Ответ 2
Спасибо, Sanket.: D У меня была проблема с отправкой данных в огромные куски, поэтому я разделил ее на 512 байт, и теперь она отлично работает даже для видео.: D Просто нужно добавить интерфейс pygtk для подтверждения приема файлов и отправки их: D
#!/usr/bin/python
# TCP client example
import socket,os
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("", 5005))
k = ' '
size = 1024
while(1):
print "Do you want to transfer a \n1.Text File\n2.Image\n3.Video\n"
k = raw_input()
client_socket.send(k)
k = int (k)
if(k == 1):
print "Enter file name\n"
strng = raw_input()
client_socket.send(strng)
size = client_socket.recv(1024)
size = int(size)
print "The file size is - ",size," bytes"
size = size*2
strng = client_socket.recv(size)
print "\nThe contents of that file - "
print strng
if (k==2 or k==3):
print "Enter file name of the image with extentsion (example: filename.jpg,filename.png or if a video file then filename.mpg etc) - "
fname = raw_input()
client_socket.send(fname)
fname = 'documents/'+fname
fp = open(fname,'w')
while True:
strng = client_socket.recv(512)
if not strng:
break
fp.write(strng)
fp.close()
print "Data Received successfully"
exit()
#data = 'viewnior '+fname
#os.system(data)
И вот код сервера
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5005))
server_socket.listen(5)
import os
client_socket, address = server_socket.accept()
print "Conencted to - ",address,"\n"
while (1):
choice = client_socket.recv(1024)
choice = int(choice)
if(choice == 1):
data = client_socket.recv(1024)
print "The following data was received - ",data
print "Opening file - ",data
fp = open(data,'r')
strng = fp.read()
size = os.path.getsize(data)
size = str(size)
client_socket.send(size)
client_socket.send (strng)
#client_socket.close()
if (choice == 2 or choice == 3):
data = client_socket.recv(1024)
print "The following data was received - ",data
print "Opening file - ",data
img = open(data,'r')
while True:
strng = img.readline(512)
if not strng:
break
client_socket.send(strng)
img.close()
print "Data sent successfully"
exit()
#data = 'viewnior '+data
#os.system(data)