Socket Chat Server für mehrere Clients

L

lc

Gast
Hallo,
Bin gerade dabei einen Chat für mehrere Clients zu schreiben. Ich lasse also ein ServerSocket in einer Schleife durchgehend neue Clients connecten, hier mal der Code dazu:
Java:
    public void run() {
        while (isEnabled) {
            try {
                Socket s=ss.accept();
                System.out.println("Client "+s.getInetAddress()+" connected!");
                new ServerThread(s).start();
            } catch (IOException ex) {
                Logger.getLogger(AcceptThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void setisEnabled(boolean a) {
        isEnabled = a;
    }
Ok, das funktioniert soweit ja schon, aber nur zwischen Client und Server, aber nicht untereinander zwischen den Clients wenn sich mehrere einloggen. Jetzt stehe ich vor einem Problem. Wie könnte ich das realisieren, dass die Clients auch miteinander kommunizieren können?
 
G

Gast2

Gast
- Client schickt seine Nachricht an den Server
- Server verteilt diese Nachricht an alle Clients die verbunden sind (hier kannste dann z.b. noch Gruppeneinteilungen machen, Chaträume, etc.)
 

oversoul

Aktives Mitglied
Wenn noch nicht so aufwendig sein soll dann am besten so:

Client sendet Text zum Server -> Server speichert den Text in eine Variable ->
Server sendet den Text an alle bekannten/verbundenen Sockets (am besten dafür alle sockets irgendwo in einem Array oder in einer Liste speichern)
 
L

lc

Gast
Ok, mein Problem ist jetzt folgendes:
Jeder Client hat seinen eigenen ServerThread. Wie kann ich nun anderen ServerThreads sagen, dass ClientXY eine Nachricht gesendet hat?
 

tuttle64

Bekanntes Mitglied
Ok, mein Problem ist jetzt folgendes:
Jeder Client hat seinen eigenen ServerThread. Wie kann ich nun anderen ServerThreads sagen, dass ClientXY eine Nachricht gesendet hat?


Im folgenden Link findest Du ein Beispiel, wo genau das gemacht wird. Das Prinzip ist trivial, aber gut durchdacht: Die Client-Threads werden in einem Clients-Array gespeichert. Will man nun an alle Clients eine Nachricht senden, holt man mit einer Schleife Client für Client und setzt ein Client[x].send(message) ab.

Creating a simple Chat Client/Server Solution
 

JavaN3rd

Mitglied
Andere Möglichkeit wäre ein Peer to Peer System, bei diesem System wird zuerst ein Hostserver gestartet und dieser sammelt z.B. alle IP sendet sie jedem Client und jeder Client startet dann selber einen Server, und verbindet sich zu allen anderen. So ist dann jeder mit jedem verbunden.

Für einen einfachen Chatserver ist das aber ziemlich sicher zu aufwändig und die Vorteile zu klein.
 

CHE123

Mitglied
hi,

etwas kürzer als das bsp von oben:

Java:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Collection;

public class Chat
{
  static private int delim = 13; // CR, LF, ETX...
  static private final Collection<Servant> servants = new ArrayList<Servant>();
  // TODO servants nicht synced => ConcurrentModificationException

  static private final class Servant implements Runnable
  {
    private final Socket so;
    private final ByteArrayOutputStream baos;
    private final byte b[];
    private volatile int running;

    private Servant(Socket so) {
      this.so = so;
      b = new byte[1024*1024]; 
      baos = new ByteArrayOutputStream(b.length);
    }
    
    @Override
    public void run() {
      try {
        for(running = 2; running == 2; ) {
          try {
            final String msg = readMessage();
            if(msg ==  null) {
              throw new IOException("socket closed by peer");
            }
            for(Servant servant : servants) {
              if(servant != this) {
                try {
                  servant.writeMessage(msg);
                }
                catch(Exception x) {
                  x.printStackTrace();
                }
              }
            }
          }
          catch(SocketTimeoutException _) {
             // gibt die möglichkeit, running zu checken
          }
        }
      }
      catch(final Exception x) {
        x.printStackTrace();
      }
      finally {
        servants.remove(this);
        try {
          so.close();
        }
        catch(final Exception x) {
          x.printStackTrace();
        }
      }
    }

    private synchronized void writeMessage(String msg) throws Exception {
      final OutputStream os = so.getOutputStream();
      os.write(msg.getBytes());
      os.write(delim);
      os.flush();
    }

    private String readMessage() throws Exception {
      final InputStream is = so.getInputStream();
      for(int x;;) {
        final byte[] a = baos.toByteArray(); // give me a copy
        for(int end = 0; end < a.length; end++) {
          if(a[end] == delim) { // delimiter found
            baos.reset();
            if((x = a.length - end - 1) > 0) {
              baos.write(a, end + 1, x);
            }
            return new String(a, 0, end);
          }
        }
        if((x = is.read(b)) <= 0) {
          return null;
        }
        baos.write(b, 0, x);
      }
    }
  }

  public static void main(String[] args) throws Exception {
    final ServerSocket ss = new ServerSocket(9999);
    try {
      for(;;) {
        final Socket so = ss.accept();
        so.setKeepAlive(true);
        so.setSoTimeout(1000);
        final Servant servant = new Servant(so);
        servants.add(servant);
        new Thread(servant).start();
      }
    }
    finally {
      ss.close();
    }
  }
}

andere, etwas komplizierte möglichkeiten sind das java.nio bzw. einen message-broker ala ActiveMQ zu benutzen.
g,
Christian
 

dayaftereh

Top Contributor
Wenn es um NIO geht würde ich mir Mal Mina Apache anschauen! Habe damit große Erfolge gemacht! ein schönes Beispiel wie man Mina einsetzt ist SIMON! Nur so als anmärkung!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
S Java Chat Server Netzwerkprogrammierung 8
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
D Chat Server/mehre Client Netzwerkprogrammierung 9
O Chat (Server) sendet an verschieden Benutzer. Netzwerkprogrammierung 10
L Chat Server programmieren Netzwerkprogrammierung 10
H Socket Java Chat - Verbindung zum Server fehlgeschlagen. Netzwerkprogrammierung 5
I Chat-Client empfängt nichts vom Server Netzwerkprogrammierung 3
A Socket UDP Chat Verbindungsproblem im WWW (Server sendet ins leere) Netzwerkprogrammierung 11
AMStyles Client Server basierter Chat Netzwerkprogrammierung 7
D Hilfe ich komme bei meinem UDP chat Server nicht mehr weiter Netzwerkprogrammierung 9
S Client-Server Chat Problem nur im lokalen Netztwerk Netzwerkprogrammierung 23
J Kleines Problem mit Chat Server Netzwerkprogrammierung 2
A server mit 2 Ports : Mit und ohne SSL Chat system Netzwerkprogrammierung 10
K Chat: Nur 1 Verbindung zum Server möglich :( Netzwerkprogrammierung 6
S JAV07P SGD client/server chat Netzwerkprogrammierung 4
L Chat Fenster Netzwerkprogrammierung 1
P Chat in Java Netzwerkprogrammierung 3
C Java Chat Admin Kenzeichnung Netzwerkprogrammierung 14
Androbin Socket Fehlerhafter Applet-Chat Netzwerkprogrammierung 12
C Microsoft Comic Chat Netzwerkprogrammierung 0
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
J Chat programmieren Netzwerkprogrammierung 12
TheJavaKid Webcam-Chat im Applet (ChatRoulette Klon) Netzwerkprogrammierung 10
K Socket Chat-GUI eigenes Event nach Empfangen Netzwerkprogrammierung 2
K chat Netzwerkprogrammierung 13
F RMI einfacher Chat - Callbacks(?) funktionieren nicht Netzwerkprogrammierung 7
L Socket Chat funktioniert nicht Netzwerkprogrammierung 2
T Socket Java Chat Netzwerkprogrammierung 2
xDarkSunx Chat JFrame Netzwerkprogrammierung 3
xDarkSunx Hilfe Chat Login Netzwerkprogrammierung 7
E JAVA Chat Netzwerkprogrammierung 19
C Java Chat funktioniert nicht richtig Netzwerkprogrammierung 6
A Multi-User-Chat Netzwerkprogrammierung 2
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
E Userliste für Chat Applet Netzwerkprogrammierung 4
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
M chat als applet umgeschrieben - unbekannter fehler :( Netzwerkprogrammierung 2
P Socket Chat selbst bauen + Multiusereditor Netzwerkprogrammierung 13
T Java Chat über UDP Netzwerkprogrammierung 7
Developer_X Habe fragen zur Chat Programmierung Netzwerkprogrammierung 4
P Java Multiuser Chat hohe Systemauslastung Netzwerkprogrammierung 24
B Die alte Leier: "Chat" Netzwerkprogrammierung 3
M chat funktioniert nicht (Connection refused: connect) Netzwerkprogrammierung 3
R Java-Chat-Applet funktioniert nur in Eclipse Netzwerkprogrammierung 3
DamienX Chat Socketserver/Client. wo ist das Problem? Netzwerkprogrammierung 2
J Client-Client-Chat ohne Serverbeteiligung Netzwerkprogrammierung 2
A Wichtig für einen Chat? Netzwerkprogrammierung 4
S Java Applet Chat Grundsatzfrage Netzwerkprogrammierung 6
R Java Chat über Inet connecten Netzwerkprogrammierung 3
F Chat Programm. Verständnisfrage while-Schleife Netzwerkprogrammierung 7
P Probleme bei Chat programm Netzwerkprogrammierung 2
C Voice Chat Netzwerkprogrammierung 3
G FAQ Chat geht nicht ? Netzwerkprogrammierung 4
T Schriftfarbe im Chat ändern Netzwerkprogrammierung 2
G ActionEvent klappt beim Chat nicht Netzwerkprogrammierung 5
T Chat-Client Netzwerkprogrammierung 12
G Chat zwischen applets: möglich? Netzwerkprogrammierung 2
T Chat mit mehreren Clients Netzwerkprogrammierung 3
C Chat , Streamproblem, PumpingException, Danke Netzwerkprogrammierung 2
S RMI Chat Problem, Client bekannt machen Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
K Lokaler Chat Netzwerkprogrammierung 5
S Chat aufs Internet ausweiten Netzwerkprogrammierung 5
J Router behindert Chat Netzwerkprogrammierung 9
S Knuddels Chat System: Bot / Nachrichten verschicken? Netzwerkprogrammierung 6
G Chat - was brauch ich Netzwerkprogrammierung 2
André B. Brauche Hilfe bei Chat Netzwerkprogrammierung 6
K Problem mit "Chat" Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
Paule Acces denied bei Chat Netzwerkprogrammierung 6
B Multi-chat Problem Netzwerkprogrammierung 3
N Java Chat-Problem Netzwerkprogrammierung 4
G Java Chat mit HTML Cleint Netzwerkprogrammierung 3
G Chat Programm - was ist los? Netzwerkprogrammierung 9
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
M Socket Verbindungen für einen Chat Netzwerkprogrammierung 10
R Mini-Chat löst BindException aus Netzwerkprogrammierung 7
F Multiclient Chat Netzwerkprogrammierung 12
K Chat: Verbindung kommt nicht zu stande Netzwerkprogrammierung 6
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
S Einfacher Multiuser chat in java Netzwerkprogrammierung 18
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15

Ähnliche Java Themen

Neue Themen


Oben