Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Πρόβλημα: Αποστολή Αρχείων Μέσω Socket.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2521

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Καλησπέρα.

Έχω φτιάξει ένα προγραμματάκι το οποίο στέλνει αρχεία μέσω του ίντερνετ αλλά με ένα μικρό πρόβλημα.
Όταν στέλνω "απλά" αρχεία που περιέχουν χαρακτήρες όπως ένα txt αρχείο το πρόγραμμά δουλεύει
κανονικά, άμα στείλω όμως ένα αρχείο πχ αρχείο βίντεο, τότε δεν δουλεύει.Με το δεν δουλεύει δεν
εννοώ ότι δεν τρέχει απλός δεν έχει τα αποτελέσματα που θέλω.

Το σημαντικό μέρος του κώδικα:
 
#-----------------O Client Στέλνει ένα αρχείο.-----------------#
file = open("c:\\....\\video.avi", "rb") #opening the file in read binary mode.
bytes_of_file = file.read() #Getting all the bytes of the file.
file.close() #closing the file.
 
sock.sendall(bytes_of_file) #Sending the bytes using a socket object.
#-----------------O Client Στέλνει ένα αρχείο.-----------------#
 
 
#-----------------O Server Λαμβάνει το αρχείο.-----------------#
file = open("c:\\....\\video.avi", "wb") #opening a file in write binary mode.
bytes_of_file = client.recv(2876) #Taking the bytes from a socket.
file.write(bytes_of_file) #Writting the bytes into the file.
file.close() #Closing the file.
#-----------------O Server Λαμβάνει το αρχείο.-----------------#

Το παραπάνω τμήμα του κωδικά μου δουλεύει μια χαρά όταν στέλνω ένα txt αρχείο, όταν όμως
στέλνω πχ ένα βίντεο το αρχείο που δημιουργείτε έχει λιγότερα bytes από το αρχικό και βέβαια
άμα το ανοίξεις λέει ότι είναι κατεστραμμένο.

Μήπως γνωρίζει κανείς ποιο είναι το πρόβλημα?

Επιπλέον έχετε υπόψιν σας ότι γνωρίζω πόσα bytes πρέπει να κάνω reiceve επομένως
στο client.recv(2876) είμαι σίγουρος ότι τόσα bytes θα με στείλει ο client.

Ευχαριστώ.
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2522

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Χωρίς να δίνεις λεπτομέρειες και αφού το script δουλεύει με αρχεία κειμένου, το μόνο που μπορώ να φανταστώ, είναι ότι έχει σχέση με το μέγεθος του αρχείου.
Οπότε: Διαβάζεις x bytes από το αρχείο και στέλνεις x bytes και όχι ολόκληρο το αρχείο.
Γράφω σε Python 3
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από kamar. Αιτία: αντικατάσταση λέξης
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2523

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Μα η read() χωρίς παραμέτρους διαβάζει ολόκληρο το αρχείο, πως γίνετε να μην στέλνω όλα τα bytes
του αρχείου.

Επιπλέον έχω παρατηρήσει ότι όσο μεγάλο και να είναι το αρχείο, αν δεν είναι αρχείο
κειμένου τότε πάντα στέλνει τον ίδιο αριθμό bytes 1336 .Δηλαδή δοκίμασα να στείλω ένα αρχείου mp3
το οποίο ήταν 3 mb. Το αρχείο που δημιουργήθηκε ήταν 1336 bytes.Μετά δοκίμασα να στείλω ένα βίντεο
1 gb αλλά το αρχείο που δημιουργήθηκε ήταν πάλι 1336 bytes.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2524

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Να και λεπτομέρειες:
H συναρτήσεις Waiting for client και send file είναι κυρίως αυτές που έχουν το πρόβλημα.
Το λέω για να μην χρειαστεί να διαβάσεις όλο των κώδικα.
#-*- coding: utf-8 -*-
 
import socket, shutil, sys, os
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from threading import Thread
 
 
#_____Global Variables_____#
 
#Booleans
running = True
server_created  = False
join_field_show = False
waiting_for_client = False
 
#Objects
Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Client = None
 
#_____Global Variables_____#
 
 
 
#===============================================Waiting_For_Client===============================================#
def Waiting_For_Client():
    global Client, waiting_for_client
 
    message = Label(text = "Waiting For Client", fg = "green") #Showing waiting message.
    message.place(x = 45, y = 90)
 
    waiting_for_client = True
 
    screen.geometry("190x110")
    Client, addr = Socket.accept() #Waiting for a client to join.
 
    messagebox.showinfo(title = "Client Joined!", message = "A client has join the server.") #Showing joined message.
    message.destroy()
    screen.geometry("190x80")
    waiting_for_client = False
 
    file_bytes = Client.recv(2898)
    save_path  = filedialog.askdirectory()
 
    file = open(save_path+"\\name.gp5", "wb")
    file.write(file_bytes)
    file.close()
 
    messagebox.showinfo(title = "Received Successfully!", message = "You reiceved the file successfully.")
    Socket.close()
 
    return
#===============================================Waiting_For_Client===============================================#
 
 
 
 
#=================================================Create_Server==================================================#
def Create_Server():
    global Client, server_created, Socket
 
    #You cant create a server.
    if (join_field_show):
        messagebox.showerror(title = "Can't Start!", message = "You can't create a server while trying to join one.")
        pass
 
    #Create a server if it's not running.
    elif (not server_created):
        Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
        Socket.bind(("", 5555)) #Binding the server to localhost.
        Socket.listen(1) #Setting the listening to 1.
 
        #Showing a message to the user.
        messagebox.showinfo(title = "Server Started!", message = "Server Created Successfully! \nPlease wait for a client to join.")
 
        wait_client = Thread(target = Waiting_For_Client, name = "Waiting_For_Client") #Creating client wait thread.
        wait_client.start() #Starting this thread.
        server_created = True
        pass
 
    #Server Already Running.
    else:
        messagebox.showerror(title = "Can't Start!", message = "Server is already created.")
        pass
 
    return
#=================================================Create_Server==================================================#
 
 
 
 
#==================================================Join_Server===================================================#
def Join_Server():
    global join_field_show, Socket
 
    Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    #You cant join a server while creating one.
    if (waiting_for_client):
        messagebox.showerror(title = "Can't Join!", message = "You can't join a server while you creating one.")
        return
 
    #---------------------------------------------Back Button---------------------------------------------#
    def Back():
        global join_field_show
 
        destroy_widgets(widgets = [ip_label, ip_entry, port_label, port_entry, join_button, back_button])
        screen.geometry("190x80") #Resizing the screen.
        join_field_show = False
        return
    #---------------------------------------------Back Button---------------------------------------------#
 
 
 
    #---------------------------------------------Join Button---------------------------------------------#
    def Join():
        global Socket
 
        #Try to connect to a server.
        try:
            Socket.connect((ip.get(), int(port.get()) ))
            messagebox.showinfo(title = "Connected!", message = "You connected successfully at "+ip.get())
            Back()
            pass
 
 
        #Failed to connect.
        except:
            messagebox.showerror(title = "Failed!", message = "There was a problem connecting at "+ip.get())
            Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            return
 
        Send_File()
 
        return
    #---------------------------------------------Join Button---------------------------------------------#
 
    screen.geometry("190x160") #Resizing the screen.
    join_field_show = True
 
    #-------------Join Server Widgets-------------#
    #Ip Lable.
    ip_label = Label(text = "IP:", fg = "green")
    ip_label.place(x = 30, y = 90)
 
    #Ip Entry.
    ip_entry = Entry(textvariable = ip, width = 15)
    ip_entry.place(x = 50, y = 90)
 
 
    #Port Label.
    port_label = Label(text = "Port:", fg = "green")
    port_label.place(x = 20, y = 110)
 
    #Port Entry.
    port_entry = Entry(textvariable = port, width = 15)
    port_entry.place(x = 50, y = 110)
 
 
    join_button = Button(text = "Join", fg = "blue", width = 8, command = Join)
    join_button.place(x = 20, y = 135)
 
 
    back_button = Button(text = "Back", fg = "blue", width = 8, command = Back)
    back_button.place(x = 100, y = 135)
    #-------------Join Server Widgets-------------#
 
#==================================================Join_Server===================================================#
 
 
 
 
#================================================destroy_widgets=================================================#
def destroy_widgets(widgets = []):
 
    for widget in widgets:
        widget.destroy()
        continue
    return
#================================================destroy_widgets=================================================#
 
 
 
 
#=================================================Exit Program===================================================#
def Exit():
    Socket.close()
    sys.exit(0)
    quit()
    return
#=================================================Exit Program===================================================#
 
 
 
def Send_File():
 
    #----------Taking the file----------#
    while (running):
        path = filedialog.askopenfilename()
 
        #Asking if this is the file he wants to send.
        if (messagebox.askyesno(title = "Are You Sure", message = "Are you sure that this is the file you want to send?\n"+path)):
            break
 
        #Else take the file again.
        else:
            continue
        pass
    #----------Taking the file----------#
 
    #Taking the bytes of the file.
    file = open(path, "rb")
    file_bytes = file.read()
    file.close()
 
    Socket.sendall(file_bytes)
    messagebox.showinfo(title = 'Sended!', message = "The file has been send successfuly.")
    Socket.close()
    return
 
 
#=================================================Main Program==================================================#
#---Building The Screen---#
screen = Tk()
screen.geometry("190x80")
screen.title("File Sender")
#---Building The Screen---#
 
 
ip   = StringVar()
ip.set("25.101.123.202")
 
port = IntVar()
port.set(5555)
 
 
#--------------------------------------------------GUI WIDGETS--------------------------------------------------#
 
#Creating the widgets.
create_server_button = Button(text = "Create Server", command = Create_Server, width = 20, fg = "red")
join_server_button   = Button(text = "Join Server", command = Join_Server, width = 20, fg = "red")
exit_button          = Button(text = "Exit", command = Exit, width = 20, fg = "red")
 
#Packing the widgets.
create_server_button.pack()
join_server_button.pack()
exit_button.pack()
#--------------------------------------------------GUI WIDGETS--------------------------------------------------#
 
 
 
 
screen.mainloop()
 
Socket.close()
sys.exit(0)
quit()
#=================================================Main Program==================================================#
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2525

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
babaliaris1 έγραψε:
Μα η read() χωρίς παραμέτρους διαβάζει ολόκληρο το αρχείο, πως γίνετε να μην στέλνω όλα τα bytes
του αρχείου.

Επιπλέον έχω παρατηρήσει ότι όσο μεγάλο και να είναι το αρχείο, αν δεν είναι αρχείο
κειμένου τότε πάντα στέλνει τον ίδιο αριθμό bytes 1336 .Δηλαδή δοκίμασα να στείλω ένα αρχείου mp3
το οποίο ήταν 3 mb. Το αρχείο που δημιουργήθηκε ήταν 1336 bytes.Μετά δοκίμασα να στείλω ένα βίντεο
1 gb αλλά το αρχείο που δημιουργήθηκε ήταν πάλι 1336 bytes.

Τι εννοώ:
file = open(filename, 'rb')
        while True:
            bytes = file.read(1024)           # διαβάζει - στέλνει 1024 bytes 
            if not bytes: break               
            sent = clientsock.send(bytes)
 
 
file = open(dropdir, 'wb')                
    while True:
        data = sock.recv(1024)                
        if not data: break                     
        file.write(data)  
 

EDIT
Για την ιστορία με sockets δεν έχω ασχοληθεί. Για να βοηθήσω παραπάνω πρέπει να μελετήσω το manual.
Γράφω σε Python 3
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από kamar. Αιτία: Προσθήκη κειμένου
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2526

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
kamar έγραψε:
babaliaris1 έγραψε:
Μα η read() χωρίς παραμέτρους διαβάζει ολόκληρο το αρχείο, πως γίνετε να μην στέλνω όλα τα bytes
του αρχείου.

Επιπλέον έχω παρατηρήσει ότι όσο μεγάλο και να είναι το αρχείο, αν δεν είναι αρχείο
κειμένου τότε πάντα στέλνει τον ίδιο αριθμό bytes 1336 .Δηλαδή δοκίμασα να στείλω ένα αρχείου mp3
το οποίο ήταν 3 mb. Το αρχείο που δημιουργήθηκε ήταν 1336 bytes.Μετά δοκίμασα να στείλω ένα βίντεο
1 gb αλλά το αρχείο που δημιουργήθηκε ήταν πάλι 1336 bytes.

Τι εννοώ:
file = open(filename, 'rb')
        while True:
            bytes = file.read(1024)           # διαβάζει - στέλνει 1024 bytes 
            if not bytes: break               
            sent = clientsock.send(bytes)
 
 
file = open(dropdir, 'wb')                
    while True:
        data = sock.recv(1024)                
        if not data: break                     
        file.write(data)  
 

EDIT
Για την ιστορία με sockets δεν έχω ασχοληθεί. Για να βοηθήσω παραπάνω πρέπει να μελετήσω το manual.

Δηλαδή τι καταφέρνεις διαβάζοντας 1024 bytes μέχρι να τελειώσει να δέχεται bytes?
Αν κατάλαβα καλά το loop σου σταματάει όταν τα bytes έχει την τιμή 1.

Στην ουσία μπορείς να με εξηγήσεις τη καταφέρνεις διαβάζοντας τα bytes ενός αρχείου
με αυτό το loop;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2527

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Προφανώς, το δίκτυο δεν μπορεί να στείλει, ένα αρχείο 1gb, με την μια. Άρα διαβάζεις ένα πολύ μικρό κομμάτι, το στέλνεις, διαβάζεις το επόμενο και πάει λέγοντας.
Όταν τα bytes είναι 0, τελειώνει η διαδικασία.
Το 1024 είναι μια τιμή, που έβαλα είναι αυθαίρετη· μπορείς να δοκιμάσεις μια μικρότερη ή μια μεγαλύτερη.
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": babaliaris1

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2528

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
Διαβάζοντας το manual, βλέπω ότι στη συνάρτηση recv, μπορεί να χρειαστεί μια σημαία.
Ίσως αυτή: MSG_WAITALL
Γράφω σε Python 3
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από kamar. Αιτία: typo
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": babaliaris1

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2545

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Αμάν! Δούλεψε με τον τρόπο που με έδειξες. :)
Άρα τελικά το λάθος ήταν ότι δεν μπορούσε το δίκτυο να τα στείλει με την μία. :P

Σε ευχαριστώ πάρα πολύ.

Αυτό είναι μια γνώση που πρέπει να γνωρίζω οπωσδήποτε για την
δημιουργία προγραμμάτων που επικοινωνούν μεταξύ τους μέσω του διαδικτύου.
Χαίρομαι πολύ που έπρεπε να αντιμετωπίσω αυτό το πρόβλημα :lol:

Και πάλι ευχαριστώ :)
Τελευταία διόρθωση: 9 Χρόνια 11 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2546

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Φίλε να σου πω κάτι. ^_^
Καταρχήν χαίρομαι πάρα πολύ που έλυσες το πρόβλημα σου. ( Τα παιδιά εδώ είναι άψογα και η γνώση διαδίδεται πολύ ωραία, μπράβο τους και συγχαρητήρια. )

Εγώ θέλω εδώ και πάρα πολύ καιρό να ασχοληθώ με τα socket στην C ή στην Python ( που τελικά με την Python βλέπω να το παλεύω το συγκεκριμένο θέμα ).
Επειδή εσύ τώρα βλέπω έχεις κάνει κάτι πάρα πολύ ωραίο και μέχρι στιγμής το έχεις καταλάβει πάρα πολύ καλά μάλλον το παραμύθι με τα sockets, μπορείς να μας βοηθήσεις και εμάς να το καταλάβουμε;

Αν μπορούσες να μας κάνεις εδώ ένα σύντομο αλλά περιεκτικό οδηγό ( που λείπουν πάρα πολύ οι ελληνικοί οδηγοί ), για τα sockets παρουσιάζοντας μας της γνώσεις σου θα βοηθούσες πάρα πολύ κόσμο που παιδεύετε με το εν λόγο ζήτημα. Ήδη έχεις βοηθήσει πάρα πολύ με τον κώδικα σου στην κοινότητα της python και του ανοιχτού κώδικα, αν εξηγούσες και 3,4 πράγματα θα ήταν πάρα πολύ καλό και για εμάς τους νέους.

Ευχαριστώ πάρα πολύ. :)
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2549

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Και βέβαια γιατί όχι. Εμένα με έχουν βοηθήσει άπειρες φορές οπότε θα χαιρόμουν να βοηθήσω και εγώ.
Θα αναρτήσω ένα θέμα στην καρτέλα python.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Tassos, Muttley Black

Πρόβλημα: Αποστολή Αρχείων Μέσω Socket. 9 Χρόνια 11 Μήνες πριν #2562

  • Tassos
  • Το Άβαταρ του/της Tassos
  • Αποσυνδεμένος
  • pyth__
  • g-lts.info
  • Δημοσιεύσεις: 78
  • Ληφθείσες Ευχαριστίες 5
Ωραία μάγκα, σε ευχαριστούμε και μπράβο σου για την αναγνώριση και την ανταπόδοση. ;)
Ομάδα Ελληνικής - Μακροχρόνιας υποστήριξη.

Greek - Long Term Support Team.

Επισκεφθείτε μας εδώ : g-lts.info
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.700 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου