2012-01-24 24 views
10

pythonでソケットプログラミングを使用して画像ファイルを送信しようとしています。私はテキストファイルを送ることができます。しかし、私はイメージファイルを開き、イメージファイルを開き、イメージファイルの内容を文字列で読み込んだ後、文字列を送信してクライアント側で受け取ってから、同じ名前のファイルに別のディレクトリですが、ファイルを開くことができません。また、私は下の私のコードを投稿しています、コメント部分は、私はすでにそれを試したことを示すものです。また、私は整数sizeを送信する問題を抱えていますが、私は反対側にいくつかのランダムな文字列を受信して​​います。ソケットプログラミングを使用した画像の送信Python

これは、サーバーのスクリプト

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は、画像ビューアです。

+1

であるあなたがそれをデバッグしようとしたことがありますか? 'print repr(クライアント)'? – Glaslos

+1

ありがとうございます。私は新しく作成されたファイルと元のファイルの間でvimdiffを試しましたが、ファイルが同じであることが判明しましたが、新しく作成されたイメージは開かれません。元の画像と複製された画像のサイズは同じで内容も同じです。 – mihirk

答えて

6

システム(Ubuntu 11.10)で同じコードを実行しましたが、サイズを文字列として送信する際に問題があります。その部分を処理するロジックを挿入すると、スムーズに動作しました。ファイルを開くこともできます。

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.py)で 第一変更されています これは私があなたの問題を解決することができる方法でありますコード:

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

これはあなたの問題を解決するのに役立ちます。

+1

ありがとうございました。私は問題を解決しました。しかし、大きなファイルを送信する際に問題が発生したので、1行ずつ送信することにしました。ここに改訂コードがあります:D – mihirk

6

ありがとうザンケット。私は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) 
+0

最初に有益な投稿に感謝します。しかし、私は問題を抱えています。両方のスクリプトを実行して画像を送信すると、「データは正常に送信されました」と表示されますが、受信した画像はコード内で後で使用する必要があります。私はこの 'input_image = Image.open(" data ")のように使います。convert( 'L')。resize((100,100))' – user2229953

+0

これをウィンドウで実行することができませんでした。両方のファイルで '' open(data、 'r') '' 'を' 'open(data、 'rb')' ''に変更し、 '' readline'''を '' read'''バイナリでデータを転送する私の問題を解決 – SkyNT

関連する問題