2012-01-24 21 views
10

का उपयोग कर छवि भेजें मैं पाइथन में सॉकेट प्रोग्रामिंग का उपयोग करके एक छवि फ़ाइल भेजने की कोशिश कर रहा हूं। मैं एक पाठ फ़ाइल भेजने में सक्षम हूं। लेकिन मैं इसे खोलकर और फ़ाइल फ़ाइल की सामग्री को एक स्ट्रिंग में पढ़कर और फिर स्ट्रिंग भेजकर और क्लाइंट पक्ष पर प्राप्त करके एक छवि फ़ाइल भेजने की कोशिश कर रहा हूं और फिर इसे उसी नाम से फ़ाइल में लिख रहा हूं अलग निर्देशिका, लेकिन मैं फ़ाइल खोलने में असमर्थ हूं। इसके अलावा मैं नीचे अपना कोड पोस्ट कर रहा हूं, टिप्पणी किए गए भाग एक संकेत हैं कि मैंने पहले ही कोशिश की है। इसके अलावा मुझे पूर्णांक 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 लिनक्स पर प्रोग्रामिंग रहा हूँ - अनधिकृत Debian आधारित Distro viewnior छवि दर्शक है।

+1

आप इसे डिबग करने की कोशिश की है है: डी बस फ़ाइलें प्राप्त करने के लिए और उन्हें भेजने के लिए पुष्टि करने के लिए PyGTK इंटरफ़ेस जोड़ने की जरूरत है? 'प्रिंट repr (क्लाइंट)'? – Glaslos

+1

आपको धन्यवाद देने का प्रयास करेगा। मैंने नई बनाई गई फ़ाइल और मूल के बीच vimdiff की कोशिश की और यह पता चला कि फाइलें समान हैं, फिर भी नव निर्मित छवि नहीं खुल जाएगी। मूल छवि का आकार और क्लोन छवि समान है और इसलिए सामग्री भी हैं। – mihirk

उत्तर

6

मैंने अपने सिस्टम (उबंटू 11.10) पर एक ही कोड चलाया और मुझे पता चला कि स्ट्रिंग के रूप में आकार भेजने में कोई समस्या है। जब मैंने उस भाग को संभालने के लिए तर्क डाला, तो यह आसानी से भाग गया। मैं फ़ाइल भी खोल सकता था। ग्राहक कोड (client.py) में 1 परिवर्तन है आकार को स्वीकार करने और इसके बारे में पावती भेजने जबकि: यह है कि कैसे मैं अपनी समस्या को हल कर सकता है -

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) 

मुझे आशा है कि यह आप अपनी समस्या को हल करने में मदद मिलेगी।

+1

धन्यवाद धन्यवाद। मैंने समस्या का समाधान किया। लेकिन यह पता चला कि मुझे बड़ी फाइलें भेजने में समस्या हो रही थी इसलिए मैंने उन्हें लाइन से लाइन भेजने का फैसला किया। यहां संशोधित कोड दिया गया है: डी – mihirk

6

धन्यवाद धन्यवाद। : डी मुझे भारी हिस्सों में डेटा भेजने में समस्या थी इसलिए मैंने इसे 512 बाइट्स में विभाजित किया और अब यह वीडियो के लिए भी पूरी तरह से काम करता है। :

#!/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") की तरह उपयोग कर रहा हूं। कन्वर्ट (' एल ')। आकार बदलें ((100, 100)) ' – user2229953

+0

मैं इसे विंडोज़ पर चलाने में असमर्थ था। बदल रहा है '' 'खुला (डेटा, 'आर')' '' '' 'खुला (डेटा, 'rb') दोनों फ़ाइलों में' '' और साथ '' 'read''' की जगह के लिए' '' readline''' बाइनरी में डेटा को स्थानांतरित करने के लिए मेरी समस्या हल हो गई – SkyNT

संबंधित मुद्दे