# Multiclient Chat



## fluxy (2. Jul 2004)

Hallo ich habe mir vorgenommen, einen multiclient Chat zu programmieren. Allerdings klappt das nicht so ganz. Es werden zwar meine Clienten abgenommen und über den Telnet kommt auch eine Willkommensnachricht an, allerdings funktioniert weder das senden noch das Empfangen.


Vom Prinzip her mache ich folgendes: 


In meiner Serverklasse richte ich die Sockets ein:


```
//Server.java
    
    // hier eben die Membervariablen der Serverklasse
    private ServerSocket mainSocket;
    private Socket waitSocket;
    private final int PORT = 12344;
    private final String IP = "127.0.0.1";
    private final int nPosClients = 10000;
    private User userPool[];
    private int nClients;

    public Server() throws IOException
    {

        nClients = 0;
        userPool = new User[nPosClients];
        mainSocket = new ServerSocket(PORT);
        waitForClients(waitSocket, "Willkommen.");
    }
```


und starte dann einen neuen Thread, und zwar für jeden User:


```
//Server.java

    private void waitForClients(Socket waitSocket, String welcomeMessage) 
    throws IOException
    {

        while (true)
        {

            waitSocket = mainSocket.accept();
            System.out.println("New Client connected");

            // Starte neuen Userthread
            // =========================
            userPool[nClients] = new User(waitSocket);
            userPool[nClients].statup("Willkommen");
            userPool[nClients].start();
            nClients++;

        }
```


hiermit soll für jeden Client ein neuer Thread erzeugt werden. Die startup methode erzeugt dann die Streams und gibt eine Willkommensnachricht an den Clienten zurück (über das Socket)


```
//Users.java

    public void statup(String welcomeMessage) throws IOException
    {

        m_outputStream = new BufferedOutputStream(m_userSocket.getOutputStream());
        m_inputStream = new BufferedInputStream(m_userSocket.getInputStream());

        m_outputStream.write(welcomeMessage.getBytes());
        m_outputStream.flush();  

    }
```



Jetzt habe ich mir gedacht kann ich in meinem Thread (Die Userklasse ist von Thread abgeleitet deshalb auch die start-methode) in einer Endlosschleife immer wieder den selben String an den Client senden (aber es kommt hier nix an:


```
//User.java

    public void run()
    {

        StringBuffer tmp = new StringBuffer(64);
        StringBuffer msg = new StringBuffer(64);
        tmp.append("Neuer User connected:  ");
        tmp.append("TESTUSER");
        System.out.println(tmp);

        while (true)
        {

            try
            {
                StringBuffer test = new StringBuffer (64);
                msg.append("test");
                m_outputStream.write(test.toString().getBytes());
                m_outputStream.flush();  
                //sleep(1000);

            }
           
            catch (IOException e)
            {
            }

        }

    }
```



Information: Im Client starte ich analog dazu einen Thread, der für das Empfangen zuständig ist. Mache ich konzeptionell irgendwas falsch oder ist im Code ein Fehler? Ich bin mir noch nicht ganz sicher, wie ich das realisieren sollte, vielleicht kann sich das ja mal jemand anschauen.


Gruß


----------



## Dante (2. Jul 2004)

Kann es sein, das du auf Client-Seite eine ganze Zeile lesen willst (readLine())? Du sendest nämlich keinen Zeilenumbruch...


----------



## Guest (2. Jul 2004)

Nein ich konnte beim Clienten irgendwie keinen BufferedInput(Output)Stream erzeugen, darum habe ich es noch ungebuffered. Hier die Run-Methode des Client-Threads:



```
public void run ()
	{
	    while (true)
	    {
	        StringBuffer revMessage = new StringBuffer (64);
	        int nrev = 0; 
	        while (nrev != -1)
	        {
	            try
                {
                    nrev = inputData.read();
                    revMessage.append(nrev);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
	        }
	        
	        
	        //String ausgeben
	        String msg = revMessage.toString();
	        System.out.println("Neuer String empfangen: " + msg);
	        display.add(msg);
	        
	    }
	}
```


----------



## Dante (2. Jul 2004)

ich kann da so beim drüberschauen auch keinen Fehler entdecken, aber deine implementierung ist auch etwas chaotisch. Ich hab neulich dazu eine kleine ANleitung geschrieben: http://www.java-forum.org/de/viewtopic.php?t=6033 vielleicht hilfts ja.


----------



## Guest (2. Jul 2004)

hmmm laso direkt mal eine Frage:



Du machst deine Streamobjekte so:


BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 




ich habe jetzt:



```
m_outputStream = new BufferedOutputStream(m_userSocket.getOutputStream()); 
        m_inputStream = new BufferedInputStream(m_userSocket.getInputStream()); 
/code]


gemacht. Macht das einen Unterschied? Ich meine es sind ja beides BufferedStreams, obwohl du nen Expliziten Writer hast.
```


----------



## Dante (2. Jul 2004)

API lesen.

Versuche mal mit deiner Variante eine ganze Zeile zu lesen, einen String zu schreiben, oder überhaupt nen Char.


----------



## Guest (2. Jul 2004)

hmmm also ich habe jetzt mal deine genommen und bei mir klappt jetzt überhaupt nix mehr


----------



## Guest (4. Jul 2004)

Hallo,


ich habe es jetzt wieder hinbekommen das das senden wieder klappt. Allerdings klappt der Client noch nicht so ganz. Muss ich eigendlich kein bind () und accept () machen?! bei dir im tut steht davon nix....


----------



## Guest (4. Jul 2004)

ich meinte natürlich bind und connect, nicht accept....


----------



## KSG9|sebastian (4. Jul 2004)

server:


```
ServerSocket ss = new ServerSocket(1234);
Socket s;

s = ss.accept();
```

Client:


```
Socket s = new Socket("ip vom server", 1234);
```


----------



## Guest (4. Jul 2004)

ja das ist ja serverseitig. Ich meine jetzt Clientmäßig...


----------



## Guest (5. Jul 2004)

hmm ich habe es es war ein anderes problem danke für eure hilfe!!!


----------



## Guest (1. Sep 2006)

Und wo lag das Problem nun???
Bin momentan selbst auch an sowas ähnlichem Beschäftigt und würde das gerne wissen damit mir das im laufe der entwicklung nicht auch passiert!


----------

