2016-09-11 4 views
0

Я создал приложение quizServer в java swing, которое соединяется с несколькими клиентами через сокет. Я могу отправлять данные на сервер с каждого клиента одновременно через соединение сокета, но когда я пытаюсь отправить данные клиентам с сервера, он принимается только одним клиентом. Как я могу изменить код для отправки данных всем клиентам, которые прослушивают сокет одновременно? Любой код/​​псевдокод будет оценен по достоинству.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 и, следовательно, может отправлять данные только в один сокет, последний добавлен. Вместо этого подумайте о том, чтобы дать классу переменную List<ServerThread>, чтобы она могла взаимодействовать со всеми клиентами. Затем в цикле while, где вы создаете соединения, добавьте каждый вновь созданный ServerThread в этот список.

Вам также необходимо исправить проблемы с потоком вашего сервера, чтобы цикл while (true) не блокировал код ключа.

Вам также потребуется обновить класс ServerThread, чтобы основной объект сервера мог связываться с его потоками.

Также вы почти никогда не хотите, чтобы класс расширял Thread. Вместо этого он реализует Runnable.

+0

Спасибо за помощь! –

+0

Я попытался реализовать runnable, но графический интерфейс становится пораженным, пока он отлично работает с extends Thread. И можете ли вы указать какой-нибудь псевдокод для обновления класса ServerThread? –