web-dev-qa-db-ja.com

ソケットプログラミングを使用して画像を送信Python

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)

私はCrunchbangLinuxでプログラミングしています-非公式のDebianベースのDistroviewniorは画像ビューアです。

10
mihirk

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)
8
mihirk

私のシステム(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")

2番目の変更は、確認応答を受け入れるためのサーバー側(server.py)コードにあります:-

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

これがあなたの問題解決に役立つことを願っています。

7
curiousMind