2016-09-11 7 views
0

java swingでソケットを介して複数のクライアントに接続するquizServerアプリケーションを作成しました。私はソケット接続を介して同時に各クライアントからサーバーにデータを送信することができますが、サーバーからクライアントにデータを送信しようとすると、クライアントは1つだけ受信されます。ソケットを同時に受信しているすべてのクライアントにデータを送信するようにコードを変更するにはどうすればよいですか?任意のコード/擬似コードが評価されます。Java:ソケットからリッスンしているすべてのクライアントにサーバーからデータを送信する

これは私のNetworkClientクラスである:ここで

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); 
     } 
    } 
} 

は私のサーバ・クラスである:

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"); 

      } 
     } 
    } 
} 

これは、サーバ・スレッドクラスです:

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:使用List<ServerThread>が解決問題。

答えて

2

サーバーにはServerThread変数が1つしかないため、最後に追加されたソケットにのみデータを送信できます。代わりに、すべてのクライアントと通信できるように、クラスにList<ServerThread>変数を与えることを検討してください。次に、接続を作成するwhileループで、新しく作成した各ServerThreadをこのリストに追加します。

また、while (true)ループでキーコードがブロックされないように、サーバーのスレッドに関する問題を修正する必要があります。

また、メインサーバーオブジェクトがそのストリームと通信できるように、ServerThreadクラスをアップグレードする必要があります。

また、クラス拡張スレッドを持つことはほとんどありません。代わりにRunnableを実装してください。

+0

ありがとうございます! –

+0

私はrunnableを実装しようとしましたが、GUIがうまくいくうちにextendsスレッドでうまく動作します。また、ServerThreadクラスをアップグレードするための擬似コードを提供してください。 –

関連する問題