-1

Я реализовал небольшую программу Java-чатов, где клиенты могут общаться с сервером. Хотя несколько клиентов не будут работать - я считаю, это связано с тем, что клиент резервирует сокет при подключении? Есть ли простой способ добавить несколько клиентских функций? Спасибо за вашу помощь.Общение с несколькими клиентами - Java Server

public void startRunning(){ 
     try{ 
     server = new ServerSocket(6789, 100); // port no, max users 
     while(true){ 
      try{ 
       waitForConnection(); 
       setupStreams(); 
       connectionRecieving(); 
      }catch(EOFException eofException){ 
       showMessage("Server ended connection \n"); 
      }finally{ 
       closeConnection(); 
      } 
     } 
     }catch(IOException ioException){ 
     ioException.printStackTrace(); 
     } 
    } 

    // Wait for connection 
    private void waitForConnection() throws IOException{ 
     showMessage("Attempting connection... \n"); 
     connection = server.accept(); 
     showMessage("Connected to: " + connection.getInetAddress().getHostName() + "\n"); 
    } 

    // Get stream to send and receive data 
    private void setupStreams() throws IOException{ 
     output = new ObjectOutputStream(connection.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(connection.getInputStream()); 
    } 

    // Close streams and sockets 
    private void closeConnection(){ 
     showMessage("----- \nClosing connections... \n"); 
     try{ 
     output.close(); 
     input.close(); 
     connection.close(); 
     }catch(IOException ioException){ 
     ioException.printStackTrace(); 
     } 
    } 
+3

Проблема в том, что каждое соединение перезаписывает предыдущее. Необходимо иметь несколько полей подключения и несколько потоков ввода/вывода. На самом деле вам нужно создать поток для обработки соединения, а _it_ может поддерживать соединение и потоки. – Gray

+0

http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html - См. Последний раздел в учебнике, он содержит полный рабочий пример того, как поддерживать несколько клиентов. –

ответ

0

Для чтения и записи для нескольких клиентов одновременно, вам необходимы либо отдельные потоки (блокировка ввода-вывода), или если вы хотите использовать один поток, НИО (блокирующий IO).

Вы можете проверить this post о различиях в реализации, но NIO - это, как правило, более эффективный путь.

Использование блокирующего ввода-вывода обычно следует за кодом, который вы использовали выше, за исключением того, что вам нужен отдельный поток для обработки каждого принятого сокета. С NIO использование немного сложнее; выезд this tutorial.

Смежные вопросы