मेनपेज मेरा फ्रंट पेज प्रदर्शित करता है और अपलोड उस पेज को प्रदर्शित करता है जहां आप उस फाइल को दर्ज करते हैं जिसे आप सर्वर के साथ स्टोर करना चाहते हैं

def upload():
        path_name = raw_input("Enter your file directory")
        open_file = open(path_name,'rb').read()
        name_split = path_name.split("\\")[-1].split('.')
        at = 1

        s.send("SAVE-"+username+"\\"+"".join(name_split[:-1])+"."+str(at)+"."+name_split[-1]+"-")

        while open_file:
            current = open_file[:1024]
            print current
            open_file = open_file[1024:]
            s.send(current)


def mainpage():
        global R2
        R2=Tk()
        gg="white"
        g="blue"
        R2.geometry('720x720')
        R2.title(username + " Dropbox")
        R2.resizable(width=False,height=False)
        logoutbt= Button(R2,text="Logout",width=10,height=2,bg=g,fg=gg,font="5",relief=RAISED,overrelief=RIDGE,command=deslogout)
        upload = Button(R2,text="Upload",width=10,height=2,bg=g,fg=gg,font="5",relief=RAISED,overrelief=RIDGE,command=desupload)
        retrieve = Button(R2,text="Retreive",width=10,height=2,bg=g,fg=gg,font="5",relief=RAISED,overrelief=RIDGE,command=desretreive)
        logoutbt.place(x = 220,y = 500)
        retrieve.place(x = 350,y = 500)
        upload.place(x = 480,y = 500)
        R2.mainloop()    
        open(path_name,'rb').close()

अब जब मैं सर्वर पर फ़ाइल भेजने के बाद अपने मुख्य पृष्ठ पर वापस लौटने के लिए मेनपेज() कमांड जोड़ता हूं, तो सर्वर अनंत लूप में फंस जाता है

ServerCode

if message[0] == "SAVE":
                    if not os.path.exists("C:\Heights\Documents\Projects\HomeWork\Project\Server1\\Files\\"+message[1].split("\\")[0]):
                        os.makedirs("C:\Heights\Documents\Projects\HomeWork\Project\Server1\\Files\\"+message[1].split("\\")[0])
                    file =open("C:\Heights\Documents\Projects\HomeWork\Project\Server1\\Files\\"+ message[1],"wb")
                    content = ""
                    while True:
                        data = current_socket.recv(1024)
                        if not data:
                            break
                        content += data

                    file.write(content)
                    file.close()

जब मैं वापस लौटने की कोशिश नहीं करता, तो फ़ाइल सर्वर तक ठीक पहुंच जाती है, लेकिन जिस क्षण मैं वह एक अतिरिक्त पंक्ति जोड़ता हूं, सर्वर अपने लूप से बाहर नहीं निकलता है जहां उसे सभी फ़ाइल सामग्री प्राप्त होती है। साथ ही, अगर मैं सर्वर से प्रतिक्रिया प्राप्त करने का प्रयास करता हूं, जब यह सभी डेटा नीचे लिखता है, तो क्लाइंट और सर्वर अटक जाते हैं।

1
Kovsze 7 जून 2017, 21:39

2 जवाब

सबसे बढ़िया उत्तर

पायथन के socket.recv(...) को यूनिक्स recv(2) फ़ंक्शन से शब्दार्थ विरासत में मिला है, और जैसा कि recv(2) आदमी में कहा गया है:

यदि सॉकेट पर कोई संदेश उपलब्ध नहीं है, तो प्राप्त कॉल संदेश के आने की प्रतीक्षा करते हैं, जब तक कि सॉकेट अवरुद्ध न हो

इसलिए, चूंकि current_socket अवरुद्ध हो रहा है, आपका सर्वर केवल data = current_socket.recv(1024) लाइन पर हैंग हो जाता है, पूरी फ़ाइल को content चर में पढ़ने के बाद जब तक क्लाइंट पर सॉकेट ठीक से बंद नहीं हो जाता।

इससे बचने के लिए:

  • किसी भी सामग्री को भेजने से पहले क्लाइंट की ओर से अपनी फ़ाइल का आकार बाइट्स में भेजें:

    import struct
    
    ...
    
    file_len_bytes = pack('!i', len(open_file))
    s.send(file_len_bytes)
    
    while open_file:
        ....
    
  • सर्वर साइड पर अपनी फ़ाइल का आकार पढ़ें और फिर इसका उपयोग यह जांचने के लिए करें कि क्या पूरी फ़ाइल पढ़ी गई है:

    import struct
    
    ...
    
    file_len_bytes = ""
    while len(file_len_bytes) < 4:
        file_len_bytes += client.recv(1)
    file_len = struct.unpack("!i", file_len_bytes[:4])[0]
    
    content = ""
    bytes_read = 0
    while bytes_read < file_len:
        data = current_socket.recv(1024)
        bytes_read += len(data)
        content += data
    
0
dekin 8 जून 2017, 00:27

सबसे पहले, एक सामान्य नियम के रूप में, सॉकेट को कुछ भी नहीं लौटाने की प्रतीक्षा करना (खाली स्ट्रिंग या जो भी हो), एक बुरा विचार है। ऐसा इसलिए है क्योंकि पायथन में एक सॉकेट केवल खाली डेटा लौटाता है यदि दूसरा पक्ष अपना सॉकेट बंद कर देता है। लेकिन अगर कोई समस्या थी या किसी कारण से सॉकेट ठीक से बंद नहीं हुआ था, तो सॉकेट। शायद असीम रूप से लटकाओ।

दूसरे, मैं देख रहा हूं कि आप अपने TKinter ऐप को एक से अधिक बार इंस्टेंट करना चाहते हैं। यह बुरा अभ्यास है, और आपको केवल अपनी मुख्य विंडो को छिपाने पर विचार करना चाहिए।

आशा है कि मैं मददगार था।

0
doratheexplorer0911 8 जून 2017, 00:11