# Chat: Nur 1 Verbindung zum Server möglich :(



## KSG9|sebastian (29. Jun 2004)

Hi Leute, ich hab bei meinem "Chat" grade das Problem, dass ich nur mit einem Client drauf connecten kann. Sobald ich den Client zum 2. Mal starte läuft er, aber er schickt nichts mehr und dann bekomm ich nen Read-Timeout. Hier der Code:

Server:


```
package chatserver;
import java.io.*;
import java.net.*;
import java.lang.Runnable;
import java.util.Vector;

public class ServerTool implements Runnable{
    private Socket sock;
    private ServerSocket serversock;
    private InputStream input;
    private OutputStream output;
    private BufferedReader reader;
    private PrintWriter writer;
    private Thread thr;
    private Vector clients;
    private int users;
    private int port;
    public ServerTool() {
           System.out.println("Server läuft");
           users = 0;
           port = 1337;
           clients = new Vector();
           thr = new Thread(this);
           thr.start();
    }
    public ServerTool(int port) {
           System.out.println("Server läuft");
           users = 0;
           this.port = port;
           clients = new Vector();
           thr = new Thread(this);
           thr.start();
    }
    public void run(){
           while(!thr.isInterrupted()){
            try{
                serversock = new ServerSocket(port);
                sock = serversock.accept();
                System.out.println("Neuer Client angemeldet...");
                sock.setKeepAlive(true);
                sock.setSoTimeout(300);
                clients.add(new ClientThreads(sock));
                users++;
                try{
                    Thread.sleep(100);
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                    thr.interrupt();
                }
            }
            catch(IOException e){
                e.printStackTrace();
                thr.interrupt();

            }


           }
    }
    public static void main(String[] args){
        new ServerTool(1339);
    }


}
```

Client-Threads(behandelt die Verbindungen zu den Clients):


```
package chatserver;
import java.io.*;
import java.net.*;
public class ClientThreads extends Thread{
    private static int number;
    private Socket sock;
    private BufferedReader reader;
    private PrintWriter writer;
    private int fehler_count;
    public ClientThreads(Socket sock) {
           fehler_count = 0;
           number = 0;
           this.sock = sock;
           this.start();
    }
    public void run(){
           while(!this.isInterrupted()){
           try{
               writer = new PrintWriter(sock.getOutputStream(),true);
               reader = new BufferedReader(
                new InputStreamReader(sock.getInputStream()));
               String text = reader.readLine();
               System.out.println(text);
               writer.write("PING\r\n");
               writer.flush();
               try{
                   Thread.sleep(100);
               }catch(InterruptedException e){
                    e.printStackTrace();
                    this.interrupt();
                    this.destroy();
                    System.out.println("Client disconnected...");

               }
           }catch(IOException e){
               e.printStackTrace();
               this.interrupt();
           }
           }

    }


}
```

Client: 

```
package ChatClient;
import java.io.*;
import java.net.*;
import java.lang.Runnable;
import java.lang.Thread;

public class ClientTool implements Runnable{
    private Socket sock;
    private InputStream input;
    private OutputStream output;
    private BufferedReader reader;
    private PrintWriter writer;
    private Thread thr;
    public ClientTool(){
           System.out.println("Client läuft");
           try{
              connect("localhost", 1339);
           }catch(IOException e){
            e.printStackTrace();
           }
    }
    public ClientTool(int port){
           System.out.println("Client läuft");
           try{
              connect("localhost", port);
           }catch(IOException e){
            e.printStackTrace();
           }
    }
    public void connect(String ip, int port) throws IOException, UnknownHostException{
           sock = new Socket(ip, port);
           sock.setSoTimeout(10000);
           sock.setKeepAlive(true);
           thr = new Thread(this);
           thr.start();

    }
    public void run(){
           while(!thr.isInterrupted()){
           System.out.println("Client Thread läuft...");
                      try{
                      writer = new PrintWriter(sock.getOutputStream(),true);
                      reader = new BufferedReader(
                     new InputStreamReader(sock.getInputStream()));
                      writer.write("PING\r\n");
                      writer.flush();
                      System.out.println(reader.readLine());
                      try{
                          Thread.sleep(100);
                       }catch(InterruptedException e){

                          e.printStackTrace();
                      }
                      }
                      catch(IOException e){
                            e.printStackTrace();
                            thr.interrupt();
                      }


                      if(!sock.isConnected() || !sock.isBound()){
                      System.out.println("Server nicht verbunden");
                      thr.interrupt();

                      }
           }

    }

    public static void main(String[] args){
        new ClientTool(1339);
    }
}
```


Bin für jede Hilfe dankbar


----------



## flashfactor (29. Jun 2004)

Also ich auch ein einfaches Beispiel mit Server-Socket incl mehrer Clients.

Ich habe zwar ein anderes Problemn wie du aber dein Problem tritt bei mir nicht auf.

Zwar habe ich Clientseitig nur Telnet zum verbinden genutzt aber es hat alles funktioniert.

Nur den ServerThread kann ich aus den Main-Thread nicht beenden.

http://www.java-forum.org/de/viewtopic.php?t=6013

Da kannst dir den kompletten Server-Code anschauen.

Ich schau mir mal deinen Teil an.


----------



## KSG9|sebastian (29. Jun 2004)

hm..brauch ich vll. ne thread group ?


----------



## flashfactor (29. Jun 2004)

brauchen tust du die threadgroup eigentlich nicht aber durch diese Threadgroup kannst alle ClientThreads z.B..: aufeinmal beenden.
und soweiter
du müsstest eigentlich den Clients garnicht abspeichern aber ch wollte es einmal so machen.


----------



## Dante (29. Jun 2004)

du erstellst hier in beiden while-schleifen die stream- und reader/writer-geschichten bei jedem durchgang neu, das ist unnötig. Vielleicht ist da der Hund schon begraben, da das Schliessen eines solchen zB. den Socket mit schliesst. 

Ansonsten sehe ich auch grad wenig was falsch sein könnte.


----------



## flashfactor (29. Jun 2004)

Richtig das war ein Fehler. 
Aber die Probleme die er beschrieben hat kamen durch das SetSoTimeout auf den ClientThread
Wenn man den weg lässt funktioniert es einwandfrei, und eigentlich braucht man ja kein Timeout auf einen ClientThread


----------



## meez (29. Jun 2004)

flashfactor hat gesagt.:
			
		

> Richtig das war ein Fehler.
> Aber die Probleme die er beschrieben hat kamen durch das SetSoTimeout auf den ClientThread
> Wenn man den weg lässt funktioniert es einwandfrei, und eigentlich braucht man ja kein Timeout auf einen ClientThread




300 ms ist wohl auch etwas kurz...


----------

