Socket [Chatprogramm] Mehrere Clients an einen Server

Zel2491

Aktives Mitglied
Moin moin, ich habe hier meine ServerKlasse, zu der im Moment leider nur ein Client connecten kann. Die letzten Stunden hab ich jetzt damit verbracht, mich durch zu googlen, was allerdings nichts gebracht hat....

Java:
package connection;

//Importe der benoetigten Bibliotheken
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import datenklassen.*;
import gui.Frame;
import server.*;

/**
 * Anlegen der Klasse Server die das Stellen des Servers ermˆglicht.
 * 
 */
public class Server extends Thread {
    // Anlegen der Variable port zum bestimmen des genutzten Serverports
    private int port = 2000;

    private List<Socket> client = new ArrayList<Socket>(50);

    private List<Msg> msgListe = new ArrayList<Msg>();

    private List<User> userListe = new ArrayList<User>(50);

    private ServerSocket serverSocket = null;

    private boolean wahr = true;

    private Input input;

    private Frame frame = new Frame();

    private boolean serverClosed = false;

    private int clientCount = 0;

    private int socketId = 0;

    private DataOutputStream out;

    /**
     * Anlegen der Methode Server um das korrekte Stellen des Servers
     * ermˆglicht.
     */
    public Server() {
        // do {
        try {
            serverSocket = new ServerSocket(port);
            int i = 0;
            Verbindung();
            while (wahr) {
                if (!client.isEmpty()) {
                    input = new Input(client.get(i));
                    frame.setServerMessage(input.getNachricht());
                    while (i < clientCount) {
                        out =
                            new DataOutputStream(client.get(socketId)
                                .getOutputStream());
                        out.writeBytes(input.getNachricht() + "\n");
                        i++;
                    }
                    if (serverClosed) {
                        out.close();
                        client.get(socketId).close();
                        frame.setServerMessage("Clients geschlossen");
                        serverSocket.close();
                    }
                    if (i == clientCount) {
                        i = 0;
                    }
                }
            }
            // } while (!wahr);
        } catch (IOException e) {

        }
    }

    public void Verbindung() throws IOException {
        boolean w = true;
        this.start();
        while (w) {
            client.add(serverSocket.accept());
            frame.setServerMessage("Client verbunden");
            w = false;
            clientCount++;
        }
    }

    public void closeUser(String user) {
        int test = UserIdent(user);
        if (test >= 0) {

        }
    }

    public int UserIdent(String user) {
        int i = 0;
        while (i < clientCount) {
            if (userListe.get(i).getName() == user) {
                return i;
            }
            i++;
        }
        return -1;
    }

    // public void setClient(Socket client) {
    // this.client = client;
    // }

    public void setServerClosed(boolean serverClosed) {
        this.serverClosed = serverClosed;
    }

}

Was muss ich an meinem Code verändern, damit mehrere Clients connecten können?

So long,

Zel
 
stichwort : THREADS

minimal

Server
Java:
ServerSocket serverSocket=new ServerSocket(PORT);
while(RUN)
{
	Socket socket=serverSocket.accept();
	(new ClientThread(this, socket)).start();
]

ClientThread
Java:
class ClientThread extends Thread
// ...
 
Hmm ist es nicht eher schlecht für jeden Client einen Thread zu starten ?

Normalerweise werden doch solche Dinge mittels eines Selectors getätigt
(Sprich SocketChannel, ServerSocketChannel und Selector im java.nio.channels Paket)
 
Hmm ist es nicht eher schlecht für jeden Client einen Thread zu starten ?

Normalerweise werden doch solche Dinge mittels eines Selectors getätigt
(Sprich SocketChannel, ServerSocketChannel und Selector im java.nio.channels Paket)

Das stimmt schon, aber das ist erst im Package java.nio aus java 1.4 hinzugekommen und etwas anspruchsvoller als dies über die simpleren Sockets zu machen.

Wenn man sich erstmal einarbeiten möchte und erst mit Java angefangen hat, ist die Variante mit den Sockets zu empfehlen und wenn man sich etwas besser auskennt, kann man sich dann an die Selectors bzw das Package NIO rantrauen!
 
kann mir mal bitte auch nur einer erklären was der vorteil von NIO *bzw NIO.2* gegenüber multi-thread sein soll ?

soweit wie ich das verstanden habe läuft der selector in EINEM thread ab und muss die ganze arbeit verrichten ...
damit wird eine multi-plattform nicht optimal ausgenutzt was eine ziemliche performance-bremse darstellt ...

Threads sind hier auf grund der tatsache das diese parallel laufe IMO zu bevorzugen ...

auf einem 4core können also der Server-Thread *sollte ebenfalls als Thread ausgelegt sein* sowie 3 client-threads GLEICHZEITIG laufen ... mit NIO läuft jedoch nur der server-loop und der selector bearbeitet die clients NACH EINANDER also seriel ...

und jetzt soll mir bitte einer den vorteil von serieller verarbeitung gegenüber paralleler verarbeitung erklären OHNE die takt-frequenz des seriellen systems soweit anzuheben das der effektive durchsatz dem parallelen entspricht *analog vergleich : P-ATA / S-ATA*
 
Multithreading kann man mit NIO kombinieren.

Es ist halt nur, dass jeder Thread extra Ressourcen benötigt, was dann wieder auf die Geschwindigkeit etc. des Programmes schlägt.
Deshalb macht man sowenig Threads wie nötig.
 
hmm .. auch wenn ich erlich gesagt nur wenig dran glauben kann das die paar extra resourcen pro thread eine größere bremse sein sollen als ein NIO system das para-seriell *mal beides kombiniert* arbeitet ...
 
naja ohne jetzt eine große Rede zu schreiben:

Jedes Betriebssystem hat eine bestimmte maximale Anzahl von Threads je Prozess, deshalb sollte man nicht für jeden Kram einen extra Thread starten.
Bei Windows zB. meinte ich wären es 2000 gewesen habe aber gerade keine Lust das zu testen 😛
 
hmm .. also meine P4 HT x64 kiste mit Win7 Ulti x64 macht laut taskmanager bis zu 3500 threads mit ... *mal getestet : im "leerlauf" um die 900 ... mit start bis zu 3500 mit EINER anwendung ... denke also nicht das es hier ein limit je anwendung gibt* ...
auf "größeren" systemen kann ich mir vorstellen das diese zahl noch deutlich höher getrieben werden kann
 

Zurück
Oben