Ciao,
c'e' un modo per poter specificare il massimo numero di socket che un ServerSocket puo accettare?
Ciao,
c'e' un modo per poter specificare il massimo numero di socket che un ServerSocket puo accettare?
un server accetta una connessione per volta
mm..Si, che acceta una connessione per volta lo so; pero'mi interessava sapere un'altra cosa, mi sono spiegato male. In pratica io voglio poter specificare il numero massimo di connessioni attive, in modo che la classe server raggiunto il limite non accetti piu' altre connessioni; una volta disconnesso un client possa accettare ancora connessioni.
Cosa posso fare? mettere un contatore nella classe ServerThread che mi indichi il numero di connessioni? mi sembra macchinoso..consigli?
codice:class Server{ ServerSocket server=new ServerSocket(6666); Socket client; while(listening){ new ServerThread(server.accept()).start(); } } class ServerThread extends Thread{ Socket client; ServerThread(Socket client){ this.client=client } }
Direi che ti conviene mettere un contatore e ogni volta che un client si disconnetti lo decrementi, cosi' che il server possa accettare altre connessioni.Originariamente inviato da s2000
Cosa posso fare? mettere un contatore nella classe ServerThread che mi indichi il numero di connessioni? mi sembra macchinoso..consigli?
Ciao,
Lorenzo
al posto di while (true) metti un for (int i=0; i<20; i++)
Gia..un problema che sorge pero' e' che se il client cade senza volerlo non posso decrementare il contatore, cosa che potrei fare solo nel caso in cui la connessione viene tarminata esplicitamente..Originariamente inviato da lelefante
Direi che ti conviene mettere un contatore e ogni volta che un client si disconnetti lo decrementi, cosi' che il server possa accettare altre connessioni.
Originariamente inviato da floyd
al posto di while (true) metti un for (int i=0; i<20; i++)
Cosi non puo funzionare perche' cosi il server mi accetta al max 20 connessioni. Una volta accettate il server termina e non posso + accettarne nel caso che si sia disconnesso qualche client..
mmm...vedro' di pensare qualcosa..magari un contatore x i client , e una classe che ogni tot secondi controlla i quelli attivi..
Si accettano volentieri altri consigli...grazie comunque!
A dire il vero e' anche inutile tenere un contatore, potresti sempre utilizzare un Vector per tenere traccia di tutti i client connessi, quindi usare le dimensioni di tale Vector per limitare il numero massimo di connessioni.
Chiaramente il Vector e' solo un idea... vedi tu quale struttura dati puo' farti piu' comodo.
Quando un client cade chiudendo il socket, il thread che sul server si occupa di comunicare con il client caduto riceve un'eccezione. Nella catch di quell'eccezione puoi mettere una chiamata ad un metodo del server principale che si occupa di terminare il thread ora inutile, di toglierlo dal Vector, ed ecco che hai liberato un posto per accettare una nuova connessione.
L'unica cosa che non ricordo e' se l'eccezione viene lanciata nel momento in cui il client si sconnette, o solo al momento in cui il thread sul server cerca di inviare un messaggio su tale socket. In questo caso ti basta implementare nel protocollo un messaggio di conferma, da richiedere periodicamente ai client, per verificare che essi siano ancora connessi.
Ciao,
Lorenzo
Ecco, giusto stavo proprio cercando di usare i Vector.
Una cosa pero' non mi e' chiara. Se devo recuperare un elemento dal vector i metodi per farlo mi ritornano un tipo Object. Quindi visto che i mei oggetti sono tutti thread faccio un casting:
Vector v=new Vector();
((Thread)(v.getLastElement())).start();
cosi posso far partire il thread alla posizione che voglio.
Ma se a priori non conoscessi che oggetti ho nel vector come faccio a fare il casting?
Secondo cosa: quando si aggiunge un elemento se il vector non e' abbastanza grande per contenerlo viene incrementato. E' possibile assegnargli una dimensione fissa?
Grazie per l'aiuto!
Se almeno hai un'idea degli oggetti che potresti aver inserito puoi utilizzare l'operatore instanceof, ma se le tipologie possono essere tante comincia a diventare brutto vedere una fila di end if per capire di che tipo di oggetto si tratti... e' il caso di valutare un'altra soluzione.Originariamente inviato da s2000
Ecco, giusto stavo proprio cercando di usare i Vector.
Ma se a priori non conoscessi che oggetti ho nel vector come faccio a fare il casting?
Secondo cosa: quando si aggiunge un elemento se il vector non e' abbastanza grande per contenerlo viene incrementato. E' possibile assegnargli una dimensione fissa?
Un Vector di dimensione fissa non ha molto senso... tanto vale usare un' array, no?
Ciao,
Lorenzo
Lo so che ha poco senso usare un vector di dimensione fissa, ma non ho molta voglia di scrivermi una classe apposta per gestire inserimento, rimozione ecc,ecc. dall'array.
Vabe' per adesso non metto il limite di connessione..
Cmnq, ho risolto come hai detto tu: per la rimozione dal vettore ho messo una istruzione nel catch , che viene eseguita quando cade il canale di comunicazione.
grazie, ciao