2014-09-18 3 views
1

다음 코드 조각이 있으며 동작 방법을 완전히 이해하지 못했습니다.소켓을 통해 여러 객체 보내기

클라이언트

public class Client { 

    public static void main(String[] args) throws InterruptedException { 
     try { 
      final Socket socket = new Socket("localhost", 3011); 
      final OutputStream socketStream = socket.getOutputStream(); 
      for (int i = 0; i < 10; i++) { 
       final byte[] message = new byte[1 * 1000 * 1000]; 
       socketStream.write(message); 
       socketStream.flush(); 
       System.out.println("sent message"); 
      } 
      socketStream.close(); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

서버 :

public class Server { 

    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     final int portNumber = 3011; 
     try { 
      ServerSocket serverSocket = new ServerSocket(portNumber); 
      System.out.println("server running on " + portNumber); 
      while (true) { 
       final Socket clientSocket = serverSocket.accept(); 
       final InputStream inputStream = clientSocket.getInputStream(); 
       final byte[] in = new byte[1024]; 
       long start = System.currentTimeMillis(); 
       int totalBytesRead = 0; 
       int bytesRead; 
       while((bytesRead = inputStream.read(in)) >= 0) { 
        totalBytesRead += bytesRead; 
       } 
       long duration = System.currentTimeMillis() - start; 
       System.out.println("got " + totalBytesRead + " bytes from socket"); 
       System.out.println("took " + duration + "ms"); 
       final double transferRatePerSecond = totalBytesRead/(duration/1000f); 
       System.out.println("average transfer was " + transferRatePerSecond + " bytes/second"); 
      } 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

지금 제가 뵙기를 희망하는 10 개별 메시지는 서버 측에서 수신합니다. 내가 실제로 얻는 것은 클라이언트가 보낸 모든 10 개의 메시지의 총인 것처럼 보이는 하나의 메시지입니다. 예를 들어 :

got socket Socket[addr=/5.67.133.157,port=53432,localport=3011] 
got 10000000 bytes from socket 
took 69332ms 
average transfer was 144233.546875 bytes/second 
+0

왜 10 개의 메시지를 가져야한다고 생각하는지 설명 할 수 있습니까? 큰 1Mb의 빈 바이트 버퍼를 만들고 그냥 보내는 중입니다. – ControlAltDel

+0

예 - 스트림 사이에 스트림을 플러시하고 10 번 보내고 있습니다. – imrichardcole

+0

왜 소켓을 사용해야합니까? WCF는이 모든 저급 수준의 자료를 처리 할 프레임 워크입니다. –

답변

3

당신이 소켓을 사용하는 방법,이하지 내장 보낼 각 메시지 사이의 중단 신호 ... 그것은 모두 같은의 InputStream에 오면 바이트로 바이트를 읽어됩니다. 쓰기를 구별 할 수 있도록하려면 DataInput/OutputStream을 사용하거나 메시지에서이를 표시하는 전송/객체 프로토콜 (예 : XML 또는 JSON)을 사용해야합니다.

그런데이 테스트를 넘어서 소켓에 관심이 있다면, 소켓/입력 스트림을 처리하기 위해 내가 작성한 유틸리티 중 일부를 살펴볼 수 있습니다. 특히 check out ServerSocketEx and DataFetcher

관련 문제