Avatar billede the_ghost Nybegynder
23. november 2004 - 15:30 Der er 6 kommentarer og
1 løsning

Lukker kun hver anden connection

Jeg har et problem!

Jeg er ved at lave en server, og på den server er der en shutdown() metode der skulle lukke alle de connections der er. Problemet er, at den kunne lukker hver anden dvs. ved 2 connections lukker den nr. 1 ved 4 lukker den nr. 1+3 ved 6 lukker den nr. 1+3+5 osv.

Her er koden jeg bruger når der kommer en connection:

while( !stop )
      {
        try
        {
          connection = server.accept( );
         
          //If not the max user number has been reached.
          if( maxUsers > getClients() )
          {
            ClientHandler client = new ClientHandler( this, connection );
            clients.add( client );
            client.start();
            System.out.println( getClients() + " connected - " + maxUsers + " allowed" );
          }
          //If the max user number has been reached.
          else
          {
            BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(
                connection.getOutputStream() ) );
           
            //A message is sent to the client
            writer.write("MAXUSERS|" + maxUsers);
            writer.newLine();
            writer.flush();
            connection.close();
          }
        }
        catch( java.net.SocketTimeoutException e )
        {
          //ignore
        }
      }


Her er shutdown() metoden:

public void closeClient( String username )
  {
    ClientHandler handler = (ClientHandler) onlineUsers.remove( username );
    handler.closeConnection();
    removeClient( handler );
  }

Hvis I kan hjælpe mig vil jeg blive meget glad, da jeg har stirret mig blind på dette.
Hvis I har brug for mere kode, så bare sig til.
Avatar billede the_ghost Nybegynder
23. november 2004 - 15:31 #1
UPS.. Forkert metode..
her er shutdown():

public void shutdown()
  {
    for( int i = 0; i < clients.size(); i++ )
    {
      System.out.println( "Nr. " + i );
      ClientHandler theOne = (ClientHandler) clients.remove( i );
      theOne.closeConnection();
    }
   
    stop = true;
  }
Avatar billede the_ghost Nybegynder
23. november 2004 - 15:58 #2
Nu er jeg mere forvirret...

Hvis jeg laver min shutdown om til dette, så virker det:

  public void shutdown()
  {
    Object[] handlers = clients.toArray();
    for( int i = 0; i < handlers.length; i++ )
    {
      System.out.println( "Nr. " + i + " - " + handlers.length );
      ClientHandler theOne = (ClientHandler) handlers[i];
      theOne.closeConnection();
    }
    stop = true;
  }

Men hvorfor kan jeg ikke få lov til at bruge en ArrayList?
Avatar billede arne_v Ekspert
23. november 2004 - 16:21 #3
Du kan godt bruge en ArrayList.

Men

for( int i = 0; i < clients.size(); i++ )

sammen med

clients.remove( i )

er uheldigt da remove "rykker" elementerne !
Avatar billede arne_v Ekspert
23. november 2004 - 16:21 #4
while(clients.size() > 0)
    {
      ClientHandler theOne = (ClientHandler) clients.remove(0);
      theOne.closeConnection();
    }

bør virke
Avatar billede arne_v Ekspert
23. november 2004 - 16:23 #5
Uddybning:

list indeholder 123456, i = 0
fjern element 0 som er 1
list indeholder 23456, i = 1
fjern element 1 som er 3
list indeholder 2456, i = 2
fjern element 2 som er 5
list indeholder 246, i = 3
løkken afslutter
Avatar billede arne_v Ekspert
23. november 2004 - 16:24 #6
og et svar
Avatar billede the_ghost Nybegynder
23. november 2004 - 16:29 #7
Ahh.. Jeg havde overhovedet ikke tænkt i de baner...
Mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester