2014-12-18 3 views
1

Java 소켓과 관련하여 기술적 인 질문이 있습니다.Java 소켓 - 서버에서 클라이언트로 데이터를 전송하십시오.

예를 들어 하나의 Java Sockets Server와 n 개의 클라이언트가 있다고 가정합니다. 서버에서 거의 모든 클라이언트로 거의 실시간으로 데이터를 보낼 수 있습니까?

더 정확하게 :

  • 는 소켓 클라이언트에서 구현 될 수있는 수신기의 종류가 있습니까?
  • 또는 나를 위해 작업이있을 때마다 x 밀리 초마다 묻는 클라이언트 코드에서 루프가 필요합니까?

누가 어떤 접근 방식이 최선 일지 말해 줄 수 있습니까? 그리고 누군가가 코드 예제를 가지고 있다면 나는 또한 행복 할 것이다.

감사합니다.

+0

리스너가 존재합니다. 선택기라고도하며 Java nio 채널 (예 : ServerSocketChannel 및 SocketChannel)과 함께 사용할 수 있습니다. 또한 io 소켓의 입력 스트림 블록을 읽은 이후로 처음부터 루프 할 필요가 없습니다. – mike

답변

3

클라이언트에서 소켓을 수신 대기하는 스레드를 설정할 수 있습니다. 서버에서 데이터를 가져 오면 계속 진행됩니다.

import java.io.IOException; 
import java.io.ObjectInputStream; 

import java.net.Socket; 

public class ResponseThread extends Thread { 

    private final Socket socket; 

    /** 
    * Client is a selfmade interface which has no direct connection to socket communication. 
    * i build it to provide start(), stop() and isRunning() methods. 
    */ 
    private final Client client; 
    /** 
    * @param client encapsulated methods to check and manage the client status itself. 
    * @param socket the socket which is connected to the server. 
    */ 
    public ResponseThread(final Client client, final Socket socket) { 
     this.client = client; 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     ObjectInputStream reader = null; 
     try(ObjectInputStream reader = new ObjectInputStream(socket.getInputStream())) { 
      while (client.isRunning()) { 
       try { 
        // The thread will wait here until the server sends data. 
        final String line = (String) reader.readObject(); 
        if (null == line || line.isEmpty()) { 
         client.stop(); 
        } else { 
         System.out.println(line); 
        } 
       } catch (IOException | ClassNotFoundException e) { 
        client.stop(); 
       } 
      } 
     } catch (IOException ex) { 
      System.out.println("ERROR Abort reading. Could not establish InputStream from Socket."); 
     } finally { 
      try { 
       reader.close(); 
      } catch (IOException ex) { 
       System.out.println("FATAL Could not close Socket.InputStream."); 
      } 
     } 
    } 

    public Socket getSocket() { 
     return socket; 
    } 
} 
+1

Thread를 통해 Runnable 또는 Callable을 사용할 것입니다. 그리고 ObjectInputStream의 사용은 모든 클라이언트가 java를 사용함을 의미합니다. – mike

+0

나도 알아, 너의 방식으로 그것을 최적화하십시오. 난 단지 예를 들어 – Niels

+0

입력을 주셔서 감사 드리고 싶습니다, 불행히도 나는 자바 1.6에 바인딩되어 있고 try-with-resources는 1.6에서 사용할 수 없습니다. :-( – felixsigl

관련 문제