PDA

Visualizza la versione completa : [JAVA] massima connessione serversocket


s2000
26-03-2003, 11:59
Ciao,
c'e' un modo per poter specificare il massimo numero di socket che un ServerSocket puo accettare?

floyd
26-03-2003, 12:05
un server accetta una connessione per volta

s2000
26-03-2003, 12:43
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?



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
}

}

lelefante
26-03-2003, 13:19
Originariamente inviato da s2000
Cosa posso fare? mettere un contatore nella classe ServerThread che mi indichi il numero di connessioni? mi sembra macchinoso..consigli?


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.

floyd
26-03-2003, 13:24
al posto di while (true) metti un for (int i=0; i<20; i++)

s2000
26-03-2003, 15:21
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.

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 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!;)

lelefante
26-03-2003, 16:15
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.

s2000
26-03-2003, 18:13
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!

lelefante
26-03-2003, 19:49
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?


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.

Un Vector di dimensione fissa non ha molto senso... tanto vale usare un' array, no?

s2000
26-03-2003, 20:07
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:D.
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

Loading