k33theod Δημοσ. 20 Απριλίου 2016 Δημοσ. 20 Απριλίου 2016 Προσπαθώ να κάνω ένα πρόγραμμα για επικοινωνία υπολογιστών με sockets Έχω κάνει τα βασικά και πριν προχωρήσω παραπέρα θα ήθελα να ξέρω αν λειτουργεί και με απομακρυσμένη σύνδεση. Ποστάρω λοιπόν τον κώδικα και όποιος θέλει να τα δοκιμάσει με κάποιον άλλον ή μαζί μου για να δούμε αν λειτουργεί θα με βοηθούσε. Πως λειτουργεί: Ο ένας χρήστης τρέχει στον υπολογιστή του τον server (δεν θα δει κάτι στην οθόνη του) και δίνει στον χρήστη που θα τρέξει τον client την IP του. Ο χρήστης που θα τρέξει τον client βάζει στον κώδικα του server_host='IP' αντί server_host='theo' και τρέχει τον κώδικα. Εφόσον γίνει η σύνδεση θα εμφανιστούν και στους δύο παράθυρα όπως της εικόνας που έχω στο τέλος και μπορούν να ανταλλάσουν μυνήματα με enter (Εφόσον δεν γίνει ) Για να κλείσoυμε τον server πηγαίνουμε στα processes του task manager και κάνουμε end task Server # Το παρών πρόγραμμα είναι η πρώτη έκδοση server για σύνδεση # και ανταλλαγή μυνημάτων με άλλο υπολογιστή (client) ο οποίος # μπορεί να συνδεθεί στον server εφόσον έχει την ip του και την ανοιχτή πόρτα # του server. # Γράφουμε στο μικρό πλαίσιο εισόδου το μύνημα και το στέλνουμε με enter from socket import * from tkinter import * from tkinter import ttk import threading as t host='' # κενό port=60007 #port 0 έως 65535 con_socket=socket() #normal socket μπορώ να παραλείψω τις παραμέτρους con_socket.bind((host, port)) # Το κάνω bind με το host , port con_socket.listen(2)# μέχρι 2 μπαίνουν σε ουρά. con_object2, address = con_socket.accept() # κάνω accept το connection όποτε έρθει def receive(): #λαμβάνω μήνυμα και το βάζω στο text μου data_recv=con_object2.recv(100) data_str_recv=data_recv.decode() message_place.config(state=NORMAL) message_place.insert(END, data_str_recv) message_place.config(state=DISABLED) def send_message(event): # Στέλνω μύνημα str_message= 'SERVER: '+entry_server.get()+'\n' data_send=str_message.encode() message_place.config(state=NORMAL) message_place.insert(END, str_message, 'server') message_place.config(state=DISABLED) con_object2.send(data_send) entry_server.delete(0,END) a=t.Thread(target=receive) #Δημιουργώ ένα thread για τη συνάρτηση receive win=Tk() win.title('SERVER') #win.geometry('400x600') message_place=Text(win, wrap=WORD ) message_place.grid(row=0, columnspan=4, sticky='W', padx=10, pady=10) message_place.insert(END, 'Connection established with ' +str(address)+'\n') message_place.tag_configure('server', foreground='blue')#Αλλάζω το χρώμα για τα μυνήματα του server message_place.config(state=DISABLED) label_server=ttk.Label(win, text='Server:') label_server.grid(row=1,column=0, sticky='W', padx=10,pady=10) entry_server=ttk.Entry(win, width=70) entry_server.grid(row=1,column=1, columnspan=3 ) a.start() # τρέχω το thread της receive # rec_button=ttk.Button(win, text='receive', command=receive)# To κουμπί για να λαμβάνω τα μηνήματα # rec_button.grid(row=2) entry_server.bind("<Return>", send_message) # με enter στέλνω μυνήματα #def receive():#wait2 win.mainloop() και ο client είναι αυτός # Το παρών πρόγραμμα είναι η πρώτη έκδοση του client για σύνδεση # και ανταλλαγή μυνημάτων με άλλο υπολογιστή ο οποίος παίζει το ρόλο # του server. Για να επιτευχθεί η σύνδεση πρέπει να βάλουμε στη θέση του # server_host το IP του μεμακρυσμένου υπολογιστή. # Γράφουμε στο μικρό πλαίσιο εισόδου το μύνημα και το στέλνουμε με enter from socket import * from tkinter import * from tkinter import ttk import threading as t server_host='theo' # Εδώ μπαίνει το hostname ή η IP πχ '17.0.0.1' port=60007 #Η πόρτα που θα χρησιμοποιήσω con_socket=socket() #Δημιουργώ το socket object con_socket.connect((server_host, port)) #χρησιμοποιώ το socket για να συνδεθώ στον άλλο # υπολογιστή. Αυτός πρέπει να έχει την πόρτα ανοιχτή και να ακούει def receive(): # Η συνάρτηση που λαμβάνει τα δεδομένα και τα τοποθετεί στο παράθυρο μου. data_recv=con_socket.recv(100) data_str_recv=data_recv.decode() message_place.config(state=NORMAL) message_place.insert(END, data_str_recv, 'server') message_place.config(state=DISABLED) def send_message(event): # Η συνάρτηση που στέλνει τα δεδομένα str_message= 'Client: '+entry_client.get()+'\n' data_send=str_message.encode() message_place.config(state=NORMAL) message_place.insert(END, str_message) message_place.config(state=DISABLED) con_socket.send(data_send) entry_client.delete(0,END) a=t.Thread(target=receive) win=Tk() win.title('CLIENT') # Το Text όπου γράφονται πληροφορίες σύνδεσεις και όλα τα μυνήματα message_place=Text(win, height=30, width=50, wrap=WORD) message_place.grid(row=0, columnspan=2, sticky='W', padx=10, pady=10) message_place.insert(END,'Η σύνδεση με τον "theo" έχει ολοκληρωθεί \n') message_place.config(state=DISABLED) # Το απενεργοποιώ για να μην μπορώ να γράψω message_place.tag_configure('server', foreground='blue') #Αλλάζω το χρώμα για τα μυνήματα του server #Μία ταμπέλα label_client=ttk.Label(win, text='client: ') label_client.grid(row=1,column=0,sticky='W',padx=10,pady=10) # Το entry για να γράφω τα μυνήματα entry_client=ttk.Entry(win, width=40) entry_client.grid(row=1,column=1) entry_client.bind("<Return>", send_message) #Με enter καλώ τη συνάρτηση που στέλνει το μύνημα a.start() # rec_button=ttk.Button(win, text='receive', command=receive) # Το κουμπί για να λαμβάνω τα μυνήματα # rec_button.grid(row=2) win.mainloop()
k33theod Δημοσ. 20 Απριλίου 2016 Μέλος Δημοσ. 20 Απριλίου 2016 Δυστυχώς όχι αύριο βράδυ. Δοκίμασε τα όπως είναι στον υπολογιστή σου και αν είναι όλα οκ αύριο βράδυ προσπαθούμε
k33theod Δημοσ. 20 Απριλίου 2016 Μέλος Δημοσ. 20 Απριλίου 2016 Όταν σε δω online θα σου στείλω personal message 1
anon667 Δημοσ. 21 Απριλίου 2016 Δημοσ. 21 Απριλίου 2016 Keep in mind, αν είστε πίσω από router (ο καθένας σπίτι του π.χ.) θα χρειαστεί να κάνετε port forwarding. 2
pmav99 Δημοσ. 21 Απριλίου 2016 Δημοσ. 21 Απριλίου 2016 also keep in mind ότι virtualbox/docker έιναι κατά πάσα πιθανότητα καλύτερος τρόπος για τέτοια test. 2
fivdis Δημοσ. 21 Απριλίου 2016 Δημοσ. 21 Απριλίου 2016 Από μακριά FAIL Τρέξε wireshark την ώρα που δοκιμάζεις και από τη μερία του client και από τη μερία του server. Για να μην χαθείς από τα άπειρα πακέτα βάλε ένα capture filter με την port που χρησιμοποιείς. Επίσης δοκίμασε με public IP αν γίνεται, για να μην μπλέκεις με NAT. Αν έχεις ΝΑΤ τοτέ βεβαιώσου πως το forwarding δουλεύει και η IP που πας να συνδεθείς είναι η εξωτερική.
k33theod Δημοσ. 22 Απριλίου 2016 Μέλος Δημοσ. 22 Απριλίου 2016 Τελικά με port forward δούλεψε, μονόπλευρα βέβαια (μόνο έλαβα μυνήματα) γιατί ο Grim Ripper δεν είχε port forward. Ευχαριστώ για τη βοήθεια. Προσεχώς η version 1.1 1
παπι Δημοσ. 23 Απριλίου 2016 Δημοσ. 23 Απριλίου 2016 Τελικά με port forward δούλεψε, μονόπλευρα βέβαια (μόνο έλαβα μυνήματα) γιατί ο Grim Ripper δεν είχε port forward. Ευχαριστώ για τη βοήθεια. Προσεχώς η version 1.1 Δεν χρειάζεται να κάνει portforward ο client. Μόνο εσύ το κάνεις ως σερβερ, επειδή εσένα ψάχνουν. Όπως και δεν χρειάζεται να βρεις άλλο άτομο για να δεις αν δουλεύει. Απλά αντί για Λαν αιπι, θα βάλεις την wan. 1
k33theod Δημοσ. 23 Απριλίου 2016 Μέλος Δημοσ. 23 Απριλίου 2016 Δεν χρειάζεται να κάνει portforward ο client. Μόνο εσύ το κάνεις ως σερβερ, επειδή εσένα ψάχνουν. Όπως και δεν χρειάζεται να βρεις άλλο άτομο για να δεις αν δουλεύει. Απλά αντί για Λαν αιπι, θα βάλεις την wan. Αν είναι έτσι όπως τα λες, τότε αυτή η version με το thread έχει πρόβλημα (μπορεί να στείλει και να λάβει μόνο ένα μύνημα) Όταν έχω όμως το receive με κουμπί δουλεύει κανονικά. Απλά πατάς κουμπί και έρχονται τα μυνήματα που έχει γράψει ο άλλος κατεβατό το ένα μετά το άλλο Πρέπει να κοιτάξω πως ακριβώς δουλεύουν τα threads
παπι Δημοσ. 23 Απριλίου 2016 Δημοσ. 23 Απριλίου 2016 Για να βγει σωστή δουλειά, θα φτιαξεις το πρόγραμμα να δουλεύει για client προς client. Ο server δεν θα στέλνει μηνύματα, απλά θα τα ρουταρει. Για να γίνει αυτό θα φτιαξεις ένα πρωτόκολλο επικοινωνίας. 1
k33theod Δημοσ. 23 Απριλίου 2016 Μέλος Δημοσ. 23 Απριλίου 2016 Κάπως έτσι το έχω σκεφτεί κι εγώ, δεν έχω όμως καταλήξει ακόμα τι ακριβώς μπορώ να κάνω. Εννοώ μαθαίνω και προχωράω και αντίστροφα. Πρωτόκολλο εννοείς κάτι συγκεκριμένο;
παπι Δημοσ. 24 Απριλίου 2016 Δημοσ. 24 Απριλίου 2016 (επεξεργασμένο) Επειδη μαρεσεις θα σου γραψω εναν σερβερ. Εσυ θα γραψεις μετα τον client, και μετα τον server. Βημα 1ο: Φτιαχτικε το github https://github.com/AnonymoPapaki/SimpleChatServer ωρα 12:43 Βημα 2ο: Αρχικο σχημα https://github.com/AnonymoPapaki/SimpleChatServer/commit/d777a77cd21c25e4df13a7f1f13504068123ff74 ωρα 1:38 Επεξ/σία 24 Απριλίου 2016 από παπι
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα