Ener: Thread, Socket Server

Hallo,
ich habe mir gerade einen Socket Server, und passent dazu einen Client, zur übertragung von Texten, programmiert. Das funktioniert wunderbar, der Client nimmt Verbindung zum Socket Server (Server) auf, schickt einen Text, der Server antwortet, der Client erhält das, und der Client ist tot, und Der Server kann eine Neue Verbndung aufnehmen....
So, jetzt hab ich den Client so umgeschrieben, dass er die Verbindung hält. Das Problem allerdings ist jetzt, das der Server auch nur noch einen Client versorgen kann. ICh hab gehört man kann dieses Problem mit threads lösen, allerdings ist mir überhaupt nicht klar wie ich das auf diesen Quelltext anwenden kann.

  
import java.net.*;  
import java.io.*;  
  
public class EchoServer {  
 /** Unser server seitiger Socket, der aif ein Rendezvous wartet */  
 protected ServerSocket sock;  
 /** Port nummer **/  
 public final static int ECHOPORT = 7;  
 /** Flag zur Debug-Steuerung **/  
 protected boolean debug = true;  
  
  
 /** main: konstruiere und starte */  
 public static void main(String[] args) {  
  
   new EchoServer(ECHOPORT).handle();  
 }  
 public EchoServer(int port) {  
  try {  
   sock = new ServerSocket(port);  
  }  
  catch (IOException e) {  
   System.err.println("I/0-Fehler beim Einrichten");  
   System.err.println(e);  
   System.exit(1);  
  }  
 }  
  
 /** Hier werden die Verbindungen verarbeitet. */  
  
 protected void handle() {  
  Socket ios = null;  
  BufferedReader is = null;  
  PrintWriter os = null;  
  while (true) {  
   try {  
    ios = sock.accept();  
    System.err.println("Akzeptiert von " + ios.getInetAddress().getHostName());  
    is = new BufferedReader(new InputStreamReader(ios.getInputStream(), "8859_1"));  
    os = new PrintWriter(new OutputStreamWriter(ios.getOutputStream(), "8859_1"), true);  
    String echoLine;  
    while ((echoLine = is.readLine()) != null) {  
     System.err.println("Gelesen: " + echoLine);  
     os.print(echoLine + "\r\n");  
     os.flush();  
     System.err.println("Geschrieben: " + echoLine);  
    }  
    System.err.println("Alles erledigt!");  
   }  
   catch (IOException e) {  
    System.err.println(e);  
   }  
   finally {  
    try {  
     if (is != null) {  
      is.close();  
     }  
     if (os != null) {  
      os.close();  
     }  
     if (ios != null) {  
      ios.close();  
     }  
    }  
    catch (IOException e) {  
     //unwahrscheinlich  
     System.err.println("I/0-Fehler beim shließen");  
    }  
   }  
  }  
  /* NOTREACHED */  
 }  
}  

Vielen Dank schon einmal im Vorraus!!!

  1. Falls jemand den Client braucht:

    ``
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.*;

    public class Client2 {
     static String mesg = "Hallo per Netzt!";
     static String IP = "5.3.154.84";

    public static void main(String[] argv) {

    // Nachricht einlesen -->

    //<--
      Socket sock =  null;
      try {
       sock = new Socket(IP, 7);
       while (true) {
        System.out.print("NACHRICHT:");
        BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
        mesg = in.readLine();

    BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        PrintWriter os = new PrintWriter(sock.getOutputStream(), true);
        os.print(mesg + "\r\n");
        os.flush();
        String reply = is.readLine();
        System.out.println("Gesendet: "" + mesg + """);
        System.out.println("Erhalten: "" + reply + """);
       }
      }
      catch (IOException e) {
       System.err.println(e);
      }

    }

    }
    [/code]

    1. Nur der besseren Uebersicht wegen..

        
      import java.io.BufferedReader;  
      import java.io.IOException;  
      import java.io.InputStreamReader;  
      import java.io.PrintWriter;  
      import java.net.*;  
        
      public class Client2 {  
       static String mesg = "Hallo per Netzt!";  
       static String IP = "5.3.154.84";  
        
       public static void main(String[] argv) {  
        
        // Nachricht einlesen -->  
        
        //<--  
        Socket sock =  null;  
        try {  
         sock = new Socket(IP, 7);  
         while (true) {  
          System.out.print("NACHRICHT:");  
          BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );  
          mesg = in.readLine();  
        
          BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream()));  
          PrintWriter os = new PrintWriter(sock.getOutputStream(), true);  
          os.print(mesg + "\r\n");  
          os.flush();  
          String reply = is.readLine();  
          System.out.println("Gesendet: \"" + mesg + "\"");  
          System.out.println("Erhalten: \"" + reply + "\"");  
         }  
        }  
        catch (IOException e) {  
         System.err.println(e);  
        }  
        
       }  
        
      }  
      
      
  2. Hallo Ener,

    So sollte das schon klappen:

      
    protected void handle() {  
      while (true) {  
        final Socket ios = sock.accept();  
        Thread myThread = new Thread(new Runnable() {  
           // hier mit ios arbeiten;  
        }  
        myThread.start();  
      }  
    }  
    
    

    Damit wird für jede Verbindung ein eigener Thread gestartet und in diesem kannst Du die dann abarbeiten.
    Thread-Programmierung ist ein recht komplexes Thema, Du solltest Dir also nach erstem experimentieren mal ein Buch o.ä. dazu angucken.
    Jede Verbindung in einem Thread zu verarbeiten ist natürlich recht einfach. Knifflig wird es, wenn Kommunikation zwischen den Threads, Zugriff auf gemeinsame Datenstrukturen, Wiederverwendung von Threads oder gar verarbeiten mehrere Verbindungen in einem Thread gleichzeitig notwendig werden. (Das ist mit asynchronem IO durchaus möglich, und gerade dann sinnvoll, wenn über viele Verbindungen oft mal eine Zeit lang gar nichts mehr passiert. Dann kann man so sehr viele Verbindungen verwalten ohne sehr viele Threads zu benötigen).

    Grüße

    Daniel