sotirakis Δημοσ. 30 Ιανουαρίου 2006 Δημοσ. 30 Ιανουαρίου 2006 Το εξής προβλημα αναζητει λύση : Έχουμε δύo PC (θεωρητικά θα πρεπει να μπορουν να ειναι περισσοτερα) και θελουμε να τα βαλουμε να επικοινωνουν μεσω sockets . Χρησιμοποιουμε την Java για να προγραμματισουμε το ολο συστημα. Ένα pc είναι ο server ο οποίος στέλνει δεδομένα σε έναν client. Ο server θα πρεπει να στελνει συνέχεια δεδομένα στους clients. Ο client τώρα , θα πρεπει να λαμβάνει συνεχεια τα δεδομενα από τον server και να τα επεξεργαζεται (αλλουνου παπα ευαγγελιο...). Αυτο που κανω ειναι το εξης : Δημιουργω ένα ServerSocket στον server και περιμενω να κανω accept αιτηματα συνδεσηες απο τους clients. Οταν τελικα αποδεχτω καποιον client,του στελνω τα δεδομενα . (Θα πρεπει να κλεισω το socket μετά ή κλεινει μόνο του;;;. Ο client με την σειρα του,οταν κανει connect,παιρνει τα δεδομενα και ....ΤΙ ΠΡΕΠΕΙ ΝΑ ΚΑΝΕΙ ΜΕ ΤΟ SOCKET ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΕΙ ;;;; Αυτη η διαδικασια θελουμε να γίνεται συνεχεια. Θελουμε η διαδικασια να ειναι δυναμικη , (κατι σαν το Messenger φανταστειτε...) , να στέλνει ο server και να τα λαμβανει αμεσως ο client. Θα πρεπει να χρησιμοποιησω Threads ; Θα πρεπει να να κλεινουμε καθε φορα τα sockets (και του server και του client) αφοτου λαβουν τα δεδομενα ; Ξερετε κανενα καλο site με tutorials ειδικα για δικτυα σε java ;;; Ευχαριστω πολύ.
Cue Δημοσ. 30 Ιανουαρίου 2006 Δημοσ. 30 Ιανουαρίου 2006 Η Sun έχει ένα πολύ ωραίο tutorial για sockets Μάλιστα ένα section του είναι για server/client pair με μια μικρή αναφορά στο τέλος για το πως να υποστηρίξεις πολλαπλούς client
Turrican Δημοσ. 31 Ιανουαρίου 2006 Δημοσ. 31 Ιανουαρίου 2006 Μιας και υπάρχει αυτό το θέμα έχω και εγώ μια σχετική απορία. Απο το παραπάνω tutorial: What Is a Socket? Normally, a server runs on a specific computer and has a socket that is bound to a specific port number. The server just waits, listening to the socket for a client to make a connection request. On the client-side: The client knows the hostname of the machine on which the server is running and the port number to which the server is connected. To make a connection request, the client tries to rendezvous with the server on the server's machine and port. If everything goes well, the server accepts the connection. Upon acceptance, the server gets a new socket bound to the same port. It needs a new socket so that it can continue to listen to the original socket for connection requests while tending to the needs of the connected client. ... --> Upon acceptance, the server gets a new socket bound to the same port. <-- Αυτό είχα την εντύπωση οτι δεν είναι δυνατό, δηλαδή δύο sockets στο ίδιο port. Κάνω λάθος;
msymvoulakis Δημοσ. 31 Ιανουαρίου 2006 Δημοσ. 31 Ιανουαρίου 2006 to server socket pou kanei listen dexetai to remote connection apo ton client se allo port apo afto pou kanei listen.afto mporeis na to deis kanontas ena println System.out.println("Socket Accepted connection from :"+c); opou c einai to socket pou ekane accept to ServerSocket gia multiple clients mia omorfi proseggisi einai na dimiourgithei mia klasi ConnectionHandler pou tha tis proothitai to socket kai tha analamvanei oli tin epkinonia me ton client afinontas to ServerSocket na eksakolouthei na kanei listen while(true){ try { Socket c = serv.accept(); System.out.println("Socket Accepted connection from :"+c); ConnHandler sc= new ConnHandler©; } catch(Exception e){ System.out.println(e); } }
Legionnaire Δημοσ. 31 Ιανουαρίου 2006 Δημοσ. 31 Ιανουαρίου 2006 Και φυσικά θα μπορούσατε να χρησιμοποιήσετε ένα νέο thread για κάθε connection (συμπληρώνω αυτά που έγραψε ο msymvoulakis) διαφορετικά με τον παραπάνω κώδικα (while loop) το πρόγραμμα θα περιμένει να τερματίσει το ConnHandler όλες του τις λειτουργίες πριν αρχίσει να περιμένει πάλι για κάποιον client. Δηλαδή έτσι όπως είναι τώρα οι συνδέσεις εξυπηρετούνται σειριακά. Αυτό που θα μπορούσε να γίνει είναι η κλάση ConnHandler να κάνει implement to Runnable interface και αντί για ConnHandler sc= new ConnHandler©; να γράψεις new Thread(new ConnHandler©).start();
Legionnaire Δημοσ. 31 Ιανουαρίου 2006 Δημοσ. 31 Ιανουαρίου 2006 Το εξής προβλημα αναζητει λύση : Έχουμε δύo PC (θεωρητικά θα πρεπει να μπορουν να ειναι περισσοτερα) και θελουμε να τα βαλουμε να επικοινωνουν μεσω sockets . Χρησιμοποιουμε την Java για να προγραμματισουμε το ολο συστημα. Ένα pc είναι ο server ο οποίος στέλνει δεδομένα σε έναν client. Ο server θα πρεπει να στελνει συνέχεια δεδομένα στους clients. Ο client τώρα ' date=' θα πρεπει να λαμβάνει συνεχεια τα δεδομενα από τον server και να τα επεξεργαζεται (αλλουνου παπα ευαγγελιο...). Αυτο που κανω ειναι το εξης : Δημιουργω ένα ServerSocket στον server και περιμενω να κανω accept αιτηματα συνδεσηες απο τους clients. Οταν τελικα αποδεχτω καποιον client,του στελνω τα δεδομενα . (Θα πρεπει να κλεισω το socket μετά ή κλεινει μόνο του;;;.[/quote'] το connection socket με τον κάθε client θα κλείσει όταν τερματιστεί η μέθοδος η οποία το χρησιμοποιεί (όπως γίνεται δηλαδή και με κάθε άλλη τοπικη μεταβλητή). Σκέψου ότι αν π.χ. ορίσεις μέσα σε μια μέθοδο "int a = 5;" αυτό πότε θα καταστραφεί; Όταν τερματίσει αυτή η μέθοδος. Φυσικά μπορείς να κλείσεις και συ το socket με την μέθοδος close() όποτε θές είτε από την μεριά του client είτε από την μεριά του server (από την άλλη μεριά θα κλείσει αυτόματα). Πρόσεχε μόνο πότε θα το κλείσεις ειδικά αν χρησιμοποιήσεις threads διότι ίσως να το κλείνεις πολύ νωρίς. Φυσικά αυτό θα σου πετάει SocketException (αν δηλαδή πας να διαβάσεις/γράψεις σε κλειστό socket) οπότε θα το καταλάβεις. Τέλος τα sockets έχουν δυο πολύ ωραία exceptions τα οποία σου προτείνω να κάνεις catch και να διαχειρίζεσαι εσύ: SocketException και SocketTimeoutException. Θα πρεπει να χρησιμοποιησω Threads ; Θα πρεπει να να κλεινουμε καθε φορα τα sockets (και του server και του client) αφοτου λαβουν τα δεδομενα ; Το ServerSocket μπορεί να είναι συνέχεια ανοιχτό ενώ συνδέονται/αποσυνδέονται πάνω του συνέχεια οι clients. Θα το κλείσεις όταν πλέον θέλεις να κάνεις shutdown τον Server. Όσο για το θέμα των Threads. Όπως εξηγώ και στο πιο πάνω μου μήνυμα, αν ΔΕΝ χρησιμοποιήσεις threads οι συνδέσεις με τους πελάτες θα γίνεται σειριακά δηλαδή μια σύνδεση την φορά. Ουσιαστικά μόλις συνδεθεί ένας πελάτης θα πρέπει όλοι οι υπόλοιποι να περιμένουν να κλείσει την σύνδεσή του πριν μιλήσει ο επόμενος με τον server, κλπ. Αυτό γίνεται επειδή ακριβώς ο κώδικας τρέχει με την σειρά. Αν όμως θες για κάθε σύνδεση από πελάτη να αρχίσει μια διαδικασία επικοινωνίας _παράλληλα_ με τις άλλες (π.χ. 2-3 ταυτόχρονα να μιλάμε με τον server) θα πρέπει να χρησιμοποιήσεις threads και συγκεκριμένα μόλις το ServerSocket κάνει accept() να σηκώνεις ένα νέο thread με αυτό το connection.
msymvoulakis Δημοσ. 31 Ιανουαρίου 2006 Δημοσ. 31 Ιανουαρίου 2006 sorry gia tin parapanw anakrivia simfonw me ton Legeonnaire apolita oti xreiazontai ta thread,apla ekana copy ton kodika apo ena palio prog pou eixa fiaksei kai ksexasa na pw gia to thread to opoio kanw start() mesa ston constructor tou ConnHandler ConnHandler(Socket s){ this.soc=s; new Thread(this).start(); } elpizw na min mperdepsa kanena
Ros_Original Δημοσ. 1 Φεβρουαρίου 2006 Δημοσ. 1 Φεβρουαρίου 2006 Sxolio panw sta threads: An 8elw o ka8e client na pairnei ena integer ID apo ton server (to opoio 8a einai eite randomly generated eite auto-incremented) 8a xreiastei na xrhsimopoihsw kanones mutual exclusion h kapoia allh diklida asfaleias? An nai parexei h java tetoies me8odous h 8a prepei na tis ulopoihsw myself? Euxaristw polu PS. 8ewrw oti einai sxetiko me ta threads se sockes gia auto ton logo den anoigw new thread. If proved wrong mods just erase it. Thx
Turrican Δημοσ. 3 Φεβρουαρίου 2006 Δημοσ. 3 Φεβρουαρίου 2006 Upon acceptance, the server gets a new socket bound to the same port. to server socket pou kanei listen dexetai to remote connection apo ton client se allo port apo afto pou kanei listen.afto mporeis na to deis kanontas ena println System.out.println("Socket Accepted connection from :"+c); Χωρις να σε αμφισβητώ, το αντίθετο μάλιστα, υπάρχει λάθος στην παραπάνω φράση (από το tutorial) η την καταλαβαίνω λάθος εγώ;
Sta Δημοσ. 3 Φεβρουαρίου 2006 Δημοσ. 3 Φεβρουαρίου 2006 Sxolio panw sta threads: An 8elw o ka8e client na pairnei ena integer ID apo ton server (to opoio 8a einai eite randomly generated eite auto-incremented) 8a xreiastei na xrhsimopoihsw kanones mutual exclusion h kapoia allh diklida asfaleias? An nai parexei h java tetoies me8odous h 8a prepei na tis ulopoihsw myself? Euxaristw polu PS. 8ewrw oti einai sxetiko me ta threads se sockes gia auto ton logo den anoigw new thread. If proved wrong mods just erase it. Thx Πρέπει να κάνεις παιχνίδι με τη λέξη-κλειδί synchronized. Αυτή μπορεί να εξασφαλίσει το κλείδωμα κάποιων (ή και όλων) των μεθόδων ενός αντικειμένου. Αυτό σημαίνει ότι μόλις ένα νήμα κλειδώσει ένα αντικείμενο, δεν επιτρέπεται σε άλλα νήματα να καλέσουν τις εν λόγω μεθόδους μέχρι να ελευθερωθεί το αντικείμενο από το πρώτο νήμα. Κοίτα για τη χρήση της synchronized και αν έχεις απορίες πάνω στην υλοποίησή σου, εδώ είμαστε.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.