简体   繁体   English

使用套接字编程Python发送图像

[英]Send image using socket programming Python

I am trying to send an image file using socket programming in python. 我试图在python中使用套接字编程发送一个图像文件。 I am able to send a text file. 我能够发送一个文本文件。 But I have been trying to send an image file, by opening it and reading the contents of the image file in a string and then sending the string and receiving it on the client side and then writing it to a file with the same name in a different directory, but I am unable to open the file. 但我一直在尝试发送一个图像文件,打开它并以字符串形式读取图像文件的内容,然后发送字符串并在客户端接收它,然后将其写入一个具有相同名称的文件中。不同的目录,但我无法打开该文件。 Also I am posting my code below, the commented parts are an indication that I have already tried it. 我也在下面发布我的代码,评论的部分表明我已经尝试过了。 Also I am having problems sending the integer size but I am receiving some random string on the other side. 此外,我在发送整数size时遇到问题,但我在另一侧收到一些随机字符串。

This is the Server 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()

And this is the client side 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)

I am programming on Crunchbang Linux - Unofficial Debian based Distro viewnior is the image viewer. 我在Crunchbang Linux上编程 - 基于Unofficial Debian的Distro viewnior是图像查看器。

Thank you Sanket. 谢谢Sanket。 :DI had a problem sending data in huge chunks so I split it into 512 bytes and now it works perfectly even for videos. :DI在以巨大的块发送数据时遇到了问题,所以我把它分成512个字节,现在它甚至可以完美地用于视频。 :D Just need to add the pygtk interface for confirmation for receiving files and sending them :D :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)

And here is the server code 这是服务器代码

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)

I ran the same code on my system (Ubuntu 11.10) and I found that, there is a problem with sending size as a string. 我在我的系统上运行相同的代码(Ubuntu 11.10),我发现,将字符串作为字符串发送时出现问题。 When I inserted logic to handle that part, it ran smoothly. 当我插入逻辑来处理该部分时,它运行顺利。 I could open the file also. 我也可以打开文件。 This is how I could solve your problem : 1st change in client code(client.py) is while accepting size and sending acknowledgement about it :- 这就是我如何解决您的问题:客户端代码(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")

2nd change is in server side(server.py) code, to accept acknowledgement :- 第二个更改是服务器端(server.py)代码,接受确认: -

client_socket.send(size)
ack = client_socket.recv(1024)
if ack == "received":
   client_socket.send (strng)

I hope this will help you to solve your problem. 我希望这能帮助您解决问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM