使用套接字编程Python发送图像
我正在尝试使用python中的套接字编程发送一个图像文件。我可以发送一个文本文件。但我一直在尝试发送一个图像文件,打开它并读取图像文件的字符串内容,然后发送字符串并在客户端接收,然后将其写入另一个目录中同名的文件,但我无法打开该文件。另外,我在下面发布我的代码,注释的部分表明我已经尝试过了。此外,我在发送整数使用套接字编程Python发送图像,python,image,sockets,Python,Image,Sockets,我正在尝试使用python中的套接字编程发送一个图像文件。我可以发送一个文本文件。但我一直在尝试发送一个图像文件,打开它并读取图像文件的字符串内容,然后发送字符串并在客户端接收,然后将其写入另一个目录中同名的文件,但我无法打开该文件。另外,我在下面发布我的代码,注释的部分表明我已经尝试过了。此外,我在发送整数size时遇到问题,但我在另一侧接收到一些随机字符串 这是服务器脚本 import socket server_socket = socket.socket(socket.AF_INET,
size
时遇到问题,但我在另一侧接收到一些随机字符串
这是服务器脚本
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()
这是客户端脚本-
#!/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的发行版
viewnior是图像查看器。我在我的系统(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)
我希望这能帮助你解决你的问题。谢谢你,桑凯特: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)
你试过调试它吗<代码>打印报告(客户端)?会尝试的,谢谢。我在新创建的文件和原始文件之间尝试了vimdiff,结果发现文件是相同的,新创建的图像仍然无法打开。原始图像和克隆图像的大小相同,内容也相同。谢谢sanket。我解决了这个问题。但事实证明我在发送大文件时遇到了问题,所以我决定一行一行地发送它们。这是修改后的代码:D首先感谢您的帮助。但是我有个问题。当运行发送图像的两个脚本时,它会打印成功发送的
数据
并停止,尽管接收到的图像应该在代码中使用后者。我是这样使用它的input\u image=image.open(“data”).convert(“L”).resize((100100))
我无法在windows上运行它。将两个文件中的open(data,'r')
更改为open(data,'rb')
,并将readline
替换为read
以二进制方式传输数据,解决了我的问题