# CPU Auslastung bei Server 100%



## RobertG (4. Apr 2009)

Hallo liebe Java Entwickler

Ich habe vor kurzem angefangen in Java zu programmieren und wollte mir einen Socketserver für Flash erstellen. Am Anfang habe ich es mit einem kleinen Chat versucht, wobei alles ganz gut klappt. Nur wird das ganze schon ab 3 Usern zu einer CPU Auslastung von 100%, da ich noch relativ neu in Java bin, kann ich solche Fehler noch nicht auf Anhieb erkennen. Ich würde mich freuen, falls mir jemand das Problem erklären und einen Lösungsansatz dazu geben könnte.

Code:

Server.class

```
import java.net.*;
import java.io.*;
import java.util.*;

public class Server
{

    Thread main;

    ServerSocket server;


    Vector <Client> clients;


    public Server()
    {
        try
        {
 
            clients = new Vector<Client>();
            server  = new ServerSocket(9999); 
            System.out.println("Server running...");
 
        } catch ( IOException e ) {

            System.out.println("Could not create socket on port 9999...");

        }
    }


    public void connect()
    {
        while ( true )
        {
            Client w;

            try
            {

                w = new Client(server.accept());
                clients.add(w);
                Thread t = new Thread(w);
                t.start();
                System.out.println("New Client connected...");
                System.out.println(clients.size() + " clients connected...");

            } catch ( IOException e ) {

                System.out.println("Could not accept client on port 9999...");

            }

            for ( int i = 0; i < clients.size(); i++ )
            {
                clients.elementAt(i).set(clients);
            }
        }
    }


    public static void main (String args[]) throws IOException
    {
        Server server = new Server();
        server.connect();
    }
}
```

Client.class

```
import java.net.*;
import java.io.*;
import java.util.*;

public class Client implements Runnable
{

    Socket c;

    Vector <Client> partners;


    public Client(Socket client)
    {
        c = client;
        partners = new Vector<Client>();
    }


    public void run()
    {
        send();
    }


    public void send()
    {
        try
        {

            InputStream in = c.getInputStream();

            byte buffer[] = new byte[2048];
            int i = 0;

            while ( i > -1 )
            {
                if ( in.available() > 0 )
                {
                    i = in.read(buffer);

                    for ( int p = 0; p < partners.size(); p++ )
                    {
                        OutputStream out = partners.elementAt(p).c.getOutputStream();
                        out.write(buffer, 0, i);
                    }
                }
            }

        } catch ( IOException e ) {

            System.out.println("Fatal error: " + e);

        }
    }


    public void set(Vector <Client> clients)
    {
        partners = clients;
    }
}
```


----------



## SlaterB (5. Apr 2009)

testest du das lokal? könnten nicht vielleicht die Test-Clients den Aufwand durch irgendeine ungeschickte Schleife verursachen?
kannst du die 100% genau diesem Prozess zuordnen, unter Windows z.B. mit dem TaskManager?

im geposteten Code sehe ich jedenfalls keinen CPU-Fehler, aber du kannst testweise auch die send() weglassen usw., wirds dann weniger?

----

noch ein Fehler:
jeder Client legt sich einen eigenen Vector<Client> an, der immer leer sein wird,
weise allen Clients den Vector<Client> des Servers hinzu, kannst z.B. im Konstruktor mit übergeben

allzu sauber wäre das aber nicht, wenn irgendjemand die Liste mit Iterator oder
for ( Client c : partners )
statt
for ( int p = 0; p < partners.size(); p++ )
durchläuft,
während der Server einen neuen Client hinzufügt, gibts eine ConcurrentModificationException,
in Threads-Kapiteln in Lehrbüchern findest du bestimmt auch was zu synchronized, das wird dann aber kompliziert

Client ist ein schlechter Klassenname innerhalb des Servers, vielleicht lieber ServerClient, User, SingleConnection oder sowas

Vector ist generell eine etwas veraltete Klasse, besonders dessen Methode elementAt(),
verwende lieber
List<Client> l = new ArrayList<Client>();
und die get()-Methode

edit: halt, ich glaube Vector ist bereits synchronisiert, das könnte sich in diesem Fall als nützlich erweisen


----------



## dayaftereh (6. Apr 2009)

Hey,

ich würde in jede Schleife einfach ein System.out.println() machen, dan siehtst du ja in welcher schleife er stecken bleibt. Ich wuerde vermuten hier


```
int i = 0;

while ( i > -1 ) {

	if ( in.available() > 0 ) {
		i = in.read(buffer);

		for ( int p = 0; p < partners.size(); p++ ){

			OutputStream out = partners.elementAt(p).c.getOutputStream();
			out.write(buffer, 0, i);
		}
	}
}
```

da wenn keine in.available() < 0 ist dan wir i auch nicht mehr gesetzt.


----------



## SlaterB (6. Apr 2009)

oh ja, ganz übersehen, soviel Code war das doch nicht


----------

