2016-09-11 9 views
0

Ich habe eine QuizServer-Anwendung in Java Swing erstellt, die über einen Socket mit mehreren Clients verbunden ist. Ich bin in der Lage, Daten von jedem Client gleichzeitig über die Socket-Verbindung an den Server zu senden, aber wenn ich versuche, Daten vom Server an die Clients zu senden, wird sie nur von 1 Client empfangen. Wie kann ich den Code ändern, um Daten an alle Clients zu senden, die gleichzeitig am Socket horchen? Jeder Code/Pseudocode wird geschätzt.Java: Senden von Daten von einem Server an alle Clients, die den Socket überwachen

Das ist meine Network Klasse:

public class NetworkClient { 

    PrintWriter os = null; 
    Socket s1 = null; 
    String line = null; 
    BufferedReader br = null; 
    BufferedReader is = null; 
    InetAddress address = null; 

    void initClient() { 
     try { 
      address = InetAddress.getLocalHost(); 
      System.out.println(address); 
     } catch (UnknownHostException ex) { 
      Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     try { 
      s1 = new Socket(address, 8888); // You can use static final constant PORT_NUM 
      br = new BufferedReader(new InputStreamReader(System.in)); 
      is = new BufferedReader(new InputStreamReader(s1.getInputStream())); 
      os = new PrintWriter(s1.getOutputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.err.print("IO Exception"); 

     } 
    } 

    void sendVal(int data) { 
     os.println(data); 
     os.flush(); 
    } 

    void close() { 
     try { 
      is.close(); 
      os.close(); 
      br.close(); 
      s1.close(); 
     } catch (Exception ex) { 
      Logger.getLogger(NetworkClient.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Hier ist meine Server-Klasse:

public class QuizServer { 

    QuizJFrame frame; 
    ServerThread st; 

    void initServer(QuizJFrame frm) { 

     frame = frm; 
     Socket s = null; 
     ServerSocket ss2 = null; 
     System.out.println("Server Listening......"); 
     try { 
      ss2 = new ServerSocket(8888); // port number used as 8888 

     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("Server error"); 
     } 

     while (true) { 
      try { 
       s = ss2.accept(); 
       System.out.println("connection Established"); 
       st = new ServerThread(s, frm); 
       st.start(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       System.out.println("Connection Error"); 

      } 
     } 
    } 
} 

Dies ist der Server Thread-Klasse:

class ServerThread extends Thread { 

    BufferedReader is = null; 
    PrintWriter os = null; 
    Socket s = null; 
    QuizJFrame frame; 
    String question[] = {"", "QUESTION 1", "QUESTION 2", "QUESTION 3", "QUESTION 4", "END"}; 
    int answer[] = {0, 1, 2, 3, 4}; 
    int index; 

    public ServerThread(Socket s, QuizJFrame frm) { 
     this.s = s; 
     frame = frm; 
     index = 1; 
     frame.setQuestion(question[index]); 
    } 

    @Override 
    public void run() { 
     int option = 0; 
     try { 
      is = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      os = new PrintWriter(s.getOutputStream()); 

     } catch (IOException e) { 
      System.out.println("IO error in server thread:" + e); 
     } 
     try { 
      while (option > -1) { 
       try { 
        option = Integer.parseInt(is.readLine()); 
        os.println(answer[index] == option); 
        os.flush(); 
       } catch (NumberFormatException e) { //to handle null value 
       } 
       System.out.println(result(option)); 
       frame.output(result(option)); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    String result(int op) { 
     if (op == -1) { 
      return "Client exited"; 
     } 
     if (answer[index] == op) { 
      return "Option " + op + " is the correct answer."; 
     } else { 
      return "Option " + op + " is incorrect."; 
     } 
    } 

    void nextQues() { 
     index++; 
     frame.setQuestion(question[index]); 
     os.println(-2); 
     os.flush(); 
    } 
} 

EDIT: Mit List<ServerThread> die aufgelöste Problem.

Antwort

2

Ihr Server verfügt nur über eine ServerThread-Variable und kann daher nur Daten an einen Socket senden, der zuletzt hinzugefügt wurde. Erwägen Sie stattdessen, der Klasse eine Variable List<ServerThread> zu geben, damit sie mit allen Clients kommunizieren kann. Fügen Sie dann in der while-Schleife, in der Sie Verbindungen erstellen, alle neu erstellten ServerThreads zu dieser Liste hinzu.

Sie müssen auch die Threading-Probleme Ihres Servers beheben, damit die while (true)-Schleife den Schlüsselcode nicht blockiert.

Sie müssen auch die ServerThread-Klasse aktualisieren, damit das Hauptserverobjekt mit seinen Streams kommunizieren kann.

Auch Sie wollen fast nie eine Klasse Thread erweitern. Lass es stattdessen Runnable implementieren.

+0

Danke für Ihre Hilfe! –

+0

Ich habe versucht, Runnable ausführbar, aber die GUI wird geschlagen, während es mit erweitert Thread funktioniert. Und können Sie bitte einen beliebigen Pseudocode für das Upgrade der ServerThread-Klasse bereitstellen? –

Verwandte Themen