Send image using socket programming Python

后端 未结 2 1039
庸人自扰
庸人自扰 2020-12-14 04:02

I am trying to send an image file using socket programming in python. I am able to send a text file. But I have been trying to send an image file, by opening it and reading

相关标签:
2条回答
  • 2020-12-14 04:56

    Thank you Sanket. :D I had a problem sending data in huge chunks so I split it into 512 bytes and now it works perfectly even for videos. :D Just need to add the pygtk interface for confirmation for receiving files and sending them :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)
    
    0 讨论(0)
  • 2020-12-14 04:59

    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. 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 :-

    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 :-

    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.

    0 讨论(0)
提交回复
热议问题