chat Server warten lassen

Andre267

Erfahrenes Mitglied
Schönen guten Morgen,

ich bin seit gestern dabei einen kleinen Chat Server zu programmieren jedoch weiß ich nicht wie ich den Server dazu bringe die Anfragen in einer Schleife zu bearbeiten, so das er nicht gleich Feierabend macht wie jetzt gerade nach einer Anfrage und er auch mehrere Clients bearbeitet?

So sieht der Server aus gerade:
Code:
package de.Java.Chat.Server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author Andres (c) by Andre 2012/2013
 */
public class Server {
    
    public static void main(String[] args) {
        //Server Socket erstellen und IOExeception fangen. (Port=9898)
        try (ServerSocket serverSocket = new ServerSocket(9898)) {
            
            //serverzeit ermitteln
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            
            //wartet auf eingehende verbindungen
            Socket clientSocket = serverSocket.accept();
            
            //Eingehende und ausgehende Narichten empfangen
            DataInputStream dataIn = new DataInputStream(clientSocket.getInputStream());
            DataOutputStream dataOut = new DataOutputStream(clientSocket.getOutputStream());
            
            // TODO Schleife bauen um weiteren Clients zu antworten
            
            //neue Narichten in UTF empfangen
            String naricht = dataIn.readUTF();


            //neue Naricht in UTF an den Client raus schicken mit aktueller Server Zeit
            dataOut.writeUTF("[" + sdf.format(new Date()) + "] "+ naricht);
            
                        
        } catch (IOException ex) {
            System.out.println("Fehler: " + ex);
        }
    }
}
 
Hi

Eine Möglichkeit wäre, jedem akzeptiertem Client einen eigenen Thread zu geben
Und Daten verarbeiten in einer Schleife, bis der Client den Socket zumacht.
 
In dem Thread musst du dann eine Endlosschleife erstellen, dort ein Thread.sleep() ausführen, damit der Prozessor sich nicht unnötig abrackert.
 
okay, thx das geht schon mal. :)

Jetzt sind mir nur gerade 2 weiter Dinge aufgefallen.

Wie sage ich dem Server das wirklich alle User eine Nachricht bekommen nur der Sender nicht. Also wie sag ich dem Server auf gut Deutsch hier user X hat an alle eine Nachricht geschickt möchte aber selbst diese Nachricht nicht erhalten?

Und bei dem Client muss ich ja eine Schleife laufen lassen die neue Nachrichten empfängt.
Nur ich weiß nicht wo ich diese schleife hinsetze das diese auch ständig aktiv ist.

Wie sieht das dann aus?

Das Gui habe ich mit Netbeans JFrame gemacht.
 
@Sender soll nichts empfangen:
Anderer Vorschlag: Der Sender-Client zeigt das, was er schickt, nicht automatisch an,
sondern kann es dann wie alle anderen Clients empfangen.
Dann brauchts beim Server keine Sonderbehandlung.

Sonst, ein zentrale Nachrichtensammlung, wo zu sendende Nachrichten
unter Angabe Sendersocket reingespeichert werden.
Regelmäßig entleeren und dabei eben dem Sendersocket
nichts von der jeweiligen Nachricht geben.
Threadsafezeug beachten.

@Client: Ein (einzelner) Thread, der auf Nachrichten wartet und ggf. eben anzeigt.
Achtung: Um vom Threada aus auf die GUI zuzugreifen muss invokeLater verwendet werden.
 
Sry sheel aber ich verstehe kein Wort.

Das einzige was ich verstanden habe ist, das ich einfach nicht das was ich verschicke selbst anzeigen lassen soll, sondern einfach empfangen soll.

Das Problem mit der User und der Zuordnung habe ich nur leider noch nicht gelöst.
 
Wo ist denn das Problem? Dein Server sollte logischerweise alle verbundenden Clients irgendwo speichern. Am besten in einer ArrayList. Wenn nun eine Nachricht eingeht, schickst du einfach an alle Clients in der Liste die Nachricht mit dem Sendernamen.
 
Zurück