【问题标题】:Send image using socket programming Python使用socket编程Python发送图片
【发布时间】:2012-02-18 04:16:27
【问题描述】:

我正在尝试使用 python 中的套接字编程发送图像文件。我可以发送一个文本文件。但是我一直在尝试发送一个图像文件,方法是打开它并以字符串形式读取图像文件的内容,然后发送字符串并在客户端接收它,然后将其写入一个同名的文件中不同的目录,但我无法打开文件。我也在下面发布我的代码,注释部分表明我已经尝试过了。此外,我在发送整数 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 是图像查看器。

【问题讨论】:

  • 你试过调试吗? print repr(client)?
  • 会试试的,谢谢。我在新创建的文件和原始文件之间尝试了 vimdiff ,结果发现文件相同,但新创建的图像仍然无法打开。原图和克隆图大小一样,内容也一样。

标签: python image sockets


【解决方案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)

希望这能帮助您解决问题。

【讨论】:

  • 谢谢你。我解决了这个问题。但事实证明我在发送大文件时遇到问题,所以我决定逐行发送它们。这是修改后的代码:D
【解决方案2】:

谢谢桑克特。 :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)

【讨论】:

  • 首先感谢您提供有用的帖子。但我有一个问题。当运行两个发送图像的脚本时,它会打印Data sent successfully 并停止,尽管接收到的图像应该在后面的代码中使用。我这样使用它input_image = Image.open("data").convert('L').resize((100, 100))
  • 我无法在 Windows 上运行它。在两个文件中将open(data,'r') 更改为open(data,'rb') 并将readline 替换为read 以传输二进制数据解决了我的问题
猜你喜欢
  • 2020-07-25
  • 2016-11-29
  • 2013-03-23
  • 2013-08-20
  • 2017-10-23
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多