Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώ να κάνω ένα πρόγραμμα για επικοινωνία υπολογιστών με sockets

Έχω κάνει τα βασικά και πριν προχωρήσω παραπέρα θα ήθελα να ξέρω αν λειτουργεί

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

 

Πως λειτουργεί:

Ο ένας χρήστης τρέχει στον υπολογιστή του τον server (δεν θα δει κάτι στην οθόνη του) και δίνει στον χρήστη που θα τρέξει τον client την IP του. Ο χρήστης που θα τρέξει τον client βάζει στον κώδικα του server_host='IP' αντί server_host='theo' και τρέχει τον κώδικα. Εφόσον γίνει η σύνδεση θα εμφανιστούν και στους δύο παράθυρα όπως της εικόνας που έχω στο τέλος και μπορούν να ανταλλάσουν μυνήματα με enter (Εφόσον δεν γίνει  :shock: )

Για να κλείσ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() 

post-372633-0-71901300-1461178723_thumb.jpg

Δημοσ.

Δυστυχώς όχι αύριο βράδυ. Δοκίμασε τα όπως είναι στον υπολογιστή σου και αν είναι όλα οκ αύριο βράδυ προσπαθούμε

Δημοσ.

Από μακριά FAIL :mad:

 

Τρέξε wireshark την ώρα που δοκιμάζεις και από τη μερία του client και από τη μερία του server.

Για να μην χαθείς από τα άπειρα πακέτα βάλε ένα capture filter με την port  που χρησιμοποιείς.

 

Επίσης δοκίμασε με public IP αν γίνεται, για να μην μπλέκεις με NAT. Αν έχεις ΝΑΤ τοτέ βεβαιώσου πως το forwarding δουλεύει και η IP που πας να συνδεθείς είναι η εξωτερική.

Δημοσ.

Τελικά με port forward δούλεψε, μονόπλευρα βέβαια (μόνο έλαβα μυνήματα) γιατί ο Grim Ripper δεν είχε port forward.

Ευχαριστώ για τη βοήθεια.

Προσεχώς η version 1.1

  • Like 1
Δημοσ.

Τελικά με port forward δούλεψε, μονόπλευρα βέβαια (μόνο έλαβα μυνήματα) γιατί ο Grim Ripper δεν είχε port forward.

Ευχαριστώ για τη βοήθεια.

Προσεχώς η version 1.1

Δεν χρειάζεται να κάνει portforward ο client. Μόνο εσύ το κάνεις ως σερβερ, επειδή εσένα ψάχνουν. Όπως και δεν χρειάζεται να βρεις άλλο άτομο για να δεις αν δουλεύει. Απλά αντί για Λαν αιπι, θα βάλεις την wan.

  • Like 1
Δημοσ.

Δεν χρειάζεται να κάνει portforward ο client. Μόνο εσύ το κάνεις ως σερβερ, επειδή εσένα ψάχνουν. Όπως και δεν χρειάζεται να βρεις άλλο άτομο για να δεις αν δουλεύει. Απλά αντί για Λαν αιπι, θα βάλεις την wan.

Αν είναι έτσι όπως τα λες, τότε αυτή η version με το thread έχει πρόβλημα (μπορεί να στείλει και να λάβει μόνο ένα μύνημα)

Όταν έχω όμως το receive με κουμπί δουλεύει κανονικά. Απλά πατάς κουμπί και έρχονται τα μυνήματα που έχει γράψει ο άλλος κατεβατό το ένα μετά το άλλο :-(  

Πρέπει να κοιτάξω πως ακριβώς δουλεύουν τα threads  :-(

Δημοσ.

Για να βγει σωστή δουλειά, θα φτιαξεις το πρόγραμμα να δουλεύει για client προς client. Ο server δεν θα στέλνει μηνύματα, απλά θα τα ρουταρει.

Για να γίνει αυτό θα φτιαξεις ένα πρωτόκολλο επικοινωνίας.

  • Like 1
Δημοσ.

Κάπως έτσι το έχω σκεφτεί κι εγώ, δεν έχω όμως καταλήξει ακόμα τι ακριβώς μπορώ να κάνω. Εννοώ μαθαίνω και προχωράω και αντίστροφα. Πρωτόκολλο εννοείς κάτι συγκεκριμένο;

Δημοσ. (επεξεργασμένο)

Επειδη μαρεσεις θα σου γραψω εναν σερβερ. Εσυ θα γραψεις μετα τον client, και μετα τον server.

 

Βημα 1ο: Φτιαχτικε το github https://github.com/AnonymoPapaki/SimpleChatServer   ωρα 12:43

Βημα 2ο: Αρχικο σχημα https://github.com/AnonymoPapaki/SimpleChatServer/commit/d777a77cd21c25e4df13a7f1f13504068123ff74 ωρα 1:38

Επεξ/σία από παπι

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...