-1

클라이언트가 서버와 통신 할 수있는 작은 Java chatroom 프로그램을 구현했습니다. 여러 클라이언트가 작동하지 않더라도 - 클라이언트가 연결되어있는 동안 소켓을 예약하기 때문에 이것이라고 생각합니까? 여러 클라이언트 기능을 추가하는 간단한 방법이 있습니까? 당신의 도움을 주셔서 감사합니다. 읽고 동시에 여러 클라이언트에 쓸 수여러 클라이언트와 통신 - Java 서버

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 차단)가 필요하거나 단일 스레드를 사용하려는 경우, NIO는 (IO를 논 블로킹).

구현 차이점에 대해서는 this post을 확인할 수 있지만 일반적으로 NIO가 더 효율적인 방법입니다.

블로킹 I/O를 사용하면 일반적으로 위에 사용 된 코드가 사용됩니다. 단, 각 허용 소켓을 처리하기 위해 별도의 스레드가 필요합니다. NIO를 사용하면 좀 더 복잡해집니다. this tutorial을 확인하십시오.