Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - comunicazione tra thread
Forum - Java - comunicazione tra thread

Avatar
tizzo (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/11/2006

Segnala al moderatore
Postato alle 9:57
Martedì, 27/03/2007
Ciao a tutti!Vi sottopongo un problema a cui non riesco a dare una soluzione efficiente.
Un server multithreaded serve più client che si comportano nel modo seguente:un client si connette e ad ogni richiesta apre un thread client,praticamente mi trovo con n thread client che vengono serviti da un unico thread server.Quest'ultimo non fa granchè,ma  
deve notificare ad esempio una scelta ad un altro thread server che serve un secondo client.
Non riesco a trovare una sincronizzazione adatta,diciamo che non saprei trovare un lock per implementare la comunicazione tra due server thread.
Se avete idee...
O forse mi conviene creare un socket differente per ciascun thread client?!?O addirittura un socket per ogni coppia thread client-thread server?
Grazie anticipate,saluti a tutti!!!

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 10:58
Mercoledì, 28/03/2007
Di solito si fa così:

Codice sorgente - presumibilmente Java

  1. // ogni client fa questo:
  2. Socket s = new Socket("where", porta);
  3. new client_thread(s).start();



Codice sorgente - presumibilmente Java

  1. // questo lo fa il server
  2. ServerSocket ss = new ServerSocket(port);
  3. Socket s = ss.accept();
  4. new server_thread(s).start();



a questo punto tu vuoi che ogni server thread comunichi con gli altri server thread? però il tuo scopo è in realtà comunicare qualcosa ad un altro client, allora generalmente si crea un Vector contenente tutti i client, a cui dovrà poter accedere ogni thread server

Codice sorgente - presumibilmente Java

  1. // questo lo fa il server
  2. public static Vector clients = new Vector();
  3. ServerSocket ss = new ServerSocket(port);
  4. Socket s = ss.accept();
  5. clients.add(s);
  6. new server_thread(s).start();



e nel momento in cui un thread server dovrà comunicare qualcosa ad un client che non gestisce direttamente, lo cercherà nel vettore (che è pubblico e statico per un agevole accesso, se vuoi fare le cose più pulite fai il solito getClients() e magari passa a server_thread un riferimento a this)

Spero di aver capito il tuo problema e di essere stato chiaro, cmq in alternativa puoi usare al posto di Vector altre collections ad esempio Hashtable se devi associare alla socket una chiave (esempio: una chat, Socket associata a Nick)

ciao

PM Quote
Avatar
tizzo (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/11/2006

Segnala al moderatore
Postato alle 18:44
Mercoledì, 28/03/2007
Ti ringrazio,ci ho perso su almeno cinque giorni e ora che mi hai illuminato...era così evidente!!!

Solo una cosa...nel caso volessi che il mio client facesse un'unica connessione con il server ma,ad istanti casuali,lanciasse dei client_thread,tipo:
Codice sorgente - presumibilmente Plain Text

  1. ...
  2. Socket s=new Socket(IPAddr,port);
  3. "when something"{
  4.                  ClientThread ct=...;
  5.                  Thread t=new Thread(ct);
  6.                  t.start();
  7.                  ...
  8.                 }



In questo caso la soluzione precedente non sarebbe
più sufficiente,perchè a uno stesso socket sono associati più processi.Mi chiedevo:è una cosa fattibile(anche tipo in termini di prestazione)
o faccio meglio a creare un nuovo socket per ogni client_thread che lancio?!?
Per essere più chiari,io(client) vorrei registrarmi ad un server un'unica volta e poi svolgere diverse azioni indipendenti,chessò,come giocare a carte più partite diverse.
grazie ancora x il consiglio!
ciao!

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:50
Giovedì, 29/03/2007
ah ho capito, no guarda io creerei una socket ogni volta e via per fare le cose semplici :k:

per il discorso della registrazione non è un grosso problema a mio avviso, anche se ogni client ha un "gruppo di socket" il client è cmq identificabile dal suo ip che puoi ottenere dall'oggetto Socket.

Ultima modifica effettuata da netarrow il 29/03/2007 alle 20:53
PM Quote
Avatar
tizzo (Normal User)
Rookie


Messaggi: 26
Iscritto: 30/11/2006

Segnala al moderatore
Postato alle 11:01
Venerdì, 30/03/2007
d'accordo,inizierò col fare così!!!
potrei a questo punto creare un serversocket adibito alle sole registrazioni e un altro che gestisce le richieste vere e proprie...così alla prima connessione il client si registra e il database utenti viene toccato una sola volta,poi per qualsiasi altra funzione mi connetto all'altro serversocket.sì!
thanx. :D

PM Quote