Kann eine ServerSocket-Klasse nicht stateful sein?

pkm

Bekanntes Mitglied
Ich habe einmal eine Frage zur Server / Socket-Programmierung, mit der ich mich vor einer Weile einmal beschäftigt habe, auch wenn das auch shcon lange her ist.
Es geht darum, dass ich einen ServerSocket habe, der darauf wartet, dass ich ein Client mit ihm verbindet:

Code:
public class Main {
public static void main(String[] args) {
 
 DateServer server = new DateServer();
  server.start();
  
  System.out.println(
  
  server.getConnections().size()
  
  );
  
   DateClient client = new DateClient();
      client.run();
 
    }
}

Hier der ServerSocket:

Code:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
public class DateServer extends Thread{
 ArrayList<Connection> connections = new ArrayList<>();
 
 public void run(){
   
     try (ServerSocket listener = new ServerSocket(9090)) {
              System.out.println("The Date Server is running");
              
              while (this.isAlive()) {
               
                  try (Socket socket = listener.accept()) {
                   
                   connections.add(new Connection());
                   
                   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                      out.println(new Date().toString());
                      
                  }
                  
              }
          } catch (IOException e) {
      
     e.printStackTrace();
    }
 }
 public ArrayList<Connection> getConnections() {
  return connections;
 }
 
}
class Connection{
 
 
 
}

Hier der ClientSocket:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class DateClient {
 public void run() {
 
    Socket socket = null;
    String response = "";
    BufferedReader in = null;
   
 try {
  socket = new Socket("127.0.0.1", 9090);
  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 } catch (IOException e) {
   
  e.printStackTrace();
 }
   try {
  response = in.readLine();
 } catch (IOException e) {
   
  e.printStackTrace();
 }
    System.out.println("Server response: " + response);
}
}


Meine Frage ist nun folgende: Ich speichere ein Connection-Objeckt (siehe die Klasse DateServer) in eine ArrayList, und hole mir diese in der Mainmethode über einen getter.
Die size()-Methode gibt für die ArrayList<Connection> aber 0 zurück, obeohl ein Connectionobjekt drin sein müsste. -> Wie kommt das?
 
Meine Frage ist nun folgende: Ich speichere ein Connection-Objeckt (siehe die Klasse DateServer) in eine ArrayList, und hole mir diese in der Mainmethode über einen getter.
Die size()-Methode gibt für die ArrayList<Connection> aber 0 zurück, obeohl ein Connectionobjekt drin sein müsste. -> Wie kommt das?

Zu dem Zeitpunkt, wo du size() aufrufst, gibt es noch keine Client-Verbindung! Erst nach dem size-Aufruf wird ja ein Client gestartet ... (später soll das wohl ein zweites Programm werden?)
 
Vielen Dank für die Beantwortung meiner trivialen Frage. Danke auch für den Buchtipp.

Ich habe es nun geändert:

Code:
public class Main {
public static void main(String[] args) {
 
 DateServer server = new DateServer();
  server.start();
    DateClient client = new DateClient();
       client.run();  
  
  System.out.println(
  server.getConnections().size()
  
  );
  
  server.interrupt();
 
    }
}

Was ich noch fragen würde: Wieso kann ich durch server.interrupt(); die while(this.isAlive())-Schleife des ServerScokets nicht killen? Gibt es einen Methodenaufruf, mit dem ich den Socket abstellen kann?
 

Neue Themen


Zurück
Oben