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
 

irgendjemand

Top Contributor
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
// ...
 

oversoul

Aktives Mitglied
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)
 

Xeonkryptos

Bekanntes Mitglied
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!
 

irgendjemand

Top Contributor
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*
 

oversoul

Aktives Mitglied
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.
 

irgendjemand

Top Contributor
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 ...
 

oversoul

Aktives Mitglied
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 :p
 

irgendjemand

Top Contributor
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Chatprogramm Netzwerkprogrammierung 25
D Chatprogramm zwischen zwei ChatClients (aktiv/passiv) Netzwerkprogrammierung 1
S User im Chatprogramm verschiedene Farben Netzwerkprogrammierung 1
K Chatprogramm - Server funktioniert nicht Netzwerkprogrammierung 5
S Java-Chatprogramm via Console Netzwerkprogrammierung 4
A Chatprogramm: Connection refused Netzwerkprogrammierung 4
Y UDP Chatprogramm auf Client/Server Basis Netzwerkprogrammierung 5
eQui Hilfe bei Chatprogramm Netzwerkprogrammierung 3
J Brauche hilfe bei Projekt: Netzwerk Chatprogramm Netzwerkprogrammierung 12
T FTP Chatprogramm probleme Netzwerkprogrammierung 2
J Chatprogramm Netzwerkprogrammierung 9
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
E Mehrere Sockets Netzwerkprogrammierung 2
C Mehrere Spielewelten im Multiplayer Netzwerkprogrammierung 2
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
G Socket Mehrere Clientanmeldungen am Server Netzwerkprogrammierung 13
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
M Jetty Konfiguration mehrere Handler? Netzwerkprogrammierung 2
F UDP Server - mehrere Pakete auf einmal Netzwerkprogrammierung 12
A Mehrere gleich Packete behandeln Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
R mehrere MySQL-Zugriffe Netzwerkprogrammierung 3
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
W Bestimmt IP Adresse verwenden wenn man mehrere hat Netzwerkprogrammierung 5
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
L mehrere Streams über einen Socket? Netzwerkprogrammierung 8
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
E Mehrere / bestimmte Netzwerkkarten ansteuern Netzwerkprogrammierung 10
F Mehrere Attachments mit JavaMail API Netzwerkprogrammierung 2
G Proxy und mehrere Verbindungen Netzwerkprogrammierung 4
G Mehrere SSL Verbindungen Netzwerkprogrammierung 2
A Mit Client auf mehrere Server zugreifen Netzwerkprogrammierung 5
M Mehrere Ports gleichzeitig abhören Netzwerkprogrammierung 5
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
G Server an mehrere Clients Netzwerkprogrammierung 15
L JavaMail: Automatisches Email Versand (mehrere Empfänger) Netzwerkprogrammierung 4
U Einen HandlerThread, der mehrere Verbindungen verwaltet? Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
G Gui von 2 Clients Synchronisieren Netzwerkprogrammierung 2
F Schulprojekt erweitern - Online Quiz mit mehreren Clients - Was benötige ich ? Netzwerkprogrammierung 0
P Socket Viele Clients bedienen mit Vert.x Netzwerkprogrammierung 9
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
G Multiple Clients and one Server --> java.lang.NullPointerException Netzwerkprogrammierung 1
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
B Socket Liste von clients - multicast Netzwerkprogrammierung 4
M Anzahl Clients aus Start- und Endadr. berechnen Netzwerkprogrammierung 54
R Viele Clients ein Server Netzwerkprogrammierung 8
borobudur Synchronisation von Clients Netzwerkprogrammierung 10
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
H Hilfe bei multiplen Clients Netzwerkprogrammierung 7
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
T Administration von Software auf Clients im Netzwerk Netzwerkprogrammierung 6
D Netzwerkprobleme bei mehreren Clients Netzwerkprogrammierung 4
F Peer to Peer Verbindung zwischen mehreren Clients? Netzwerkprogrammierung 8
A Server mit mehreren Clients Netzwerkprogrammierung 2
5 Webservice max. mit 5 Clients möglich Netzwerkprogrammierung 10
M clients untereinander kommunizieren Netzwerkprogrammierung 2
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
B Rmi Kommunikation Server zu mehreren Clients? Netzwerkprogrammierung 3
T Am RMI-Server: IP des Clients ermitteln? Netzwerkprogrammierung 2
J SecurityManager - Server-Zugriff nur von bestimmten Clients? Netzwerkprogrammierung 2
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
T Chat mit mehreren Clients Netzwerkprogrammierung 3
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
D Netzwerk Betrachtung mit vielen Clients Netzwerkprogrammierung 2
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
I IP Adresse des Clients einer Socket Verbindung Netzwerkprogrammierung 2
S Server mit mehreren Clients Nachrichten austauschen Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben