2013-05-05 2 views
1

현재 Java를 사용하여 소켓을 열고 그 위에 데이터를 보내고 보내야하는 응용 프로그램을 작성하고 있습니다.Java BufferedReader 읽기 소켓이 null을 반환하지 않습니다.

BufferedReader.readLine()은 일단 버퍼가 비면 null을 반환한다는 것을 알고 있습니다. 그러나 내 코드 BufferedReader에서 선을 읽는 루프에서 종료되지 않습니다. 아이디어는 노래 목록을받은 다음 노래가 재생되기 시작하는 서버에 값을 보냅니다.

package me.frankvanbever.MediaServerClient; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

     public class MediaServerClient { 

      /** 
      * @param args 
      */ 
      public static void main(String[] args) { 

        Socket server; 
        try { 
         server = new Socket("10.42.0.41" , 2626); 

         InputStream in = server.getInputStream(); 
         OutputStream out = server.getOutputStream(); 

         BufferedReader bin = new BufferedReader(new InputStreamReader(in) , 4096); 

         String inputline; 
         while((inputline = bin.readLine()) != null){ 

          System.out.println(inputline); 

         } 

         System.out.println("exited loop"); 
         out.write('1'); 
        } catch (UnknownHostException e) { 
        } catch (IOException e) { 
        } 


      } 

    } 

이 정상적인 동작입니다 :

코드인가? 서버는 파이썬으로 작성되었으며 소스 코드를 변경할 수 있습니다.

답변

5

BufferedReader.readLine()은 일단 버퍼가 비면 일단 null을 반환합니다. 기본 복귀 되면 그것은 null를 반환

번호 폐쇄. 연결하려는 서버가 연결을 닫지 않으면 BufferedReader이 멈추어 다음 줄의 텍스트를 기다립니다.

TCP가 스트림 지향적이라는 것을 잊지 마십시오 (예 : BufferedReader). 프로토콜에 넣지 않는 한 "완전한 메시지"는 표시되지 않습니다. 이러한 이유로 프로토콜에는 메시지 터미네이터 같은 것이 포함되거나 메시지를 보내기 전에 메시지에있는 데이터의 양을 지정합니다.

+0

그래서 내 클라이언트가 서버에서 물건을 보내지 못하게한다는 것을 알리는 방법을 강구해야할까요? –

+1

@FrankVanbever : 프로토콜 자체에 서버를 구축해야합니다. 서버와 클라이언트 모두 동의해야합니다. 당신은 "5 초 동안 아무 것도받지 못했다면 나는 끝났다고 가정 할 것"이라는 라인을 따라 효과적으로 뭔가를 가질 수 있습니다. 그러나 느린 네트워크에도 불구하고 매우 약해지고, 빠른 네트워크를 지원할뿐만 아니라 플랫폼이 시간 초과를 지원하지 않는 한 비교적 코드 작성이 어렵습니다. –

+1

@FrankVanbever 더 이상 전송할 것이 없을 때 연결을 닫을 수 있습니다. 또는 연결을 계속 열어 둘 필요가있을 경우,'[End of Message]'또는 여러분이 선택한 것과 같은 줄을 비어있을 수 있습니다. BTW 전자 메일은 그 자체로 한 줄에'.'을 보냅니다. –

관련 문제