2013-01-09 2 views
0

내 응용 프로그램 중 하나를 Java 6에서 Java 7로 업그레이드하는 중에 흥미로운 문제가 발생했습니다. 간단한 Java 소켓 프로그램입니다. COM 소켓에 명령을 보내고 응답을받습니다. Java 6 환경에서 완벽하게 작동하지만 Java 7 환경에서 동일한 코드를 실행하려고하면 소켓이 InputStream에 아무것도 표시되지 않는 것처럼 보입니다.소켓이 Java에서 입력을 수신하지 못합니다.

내가 연결하고있는 COM 소켓이 명령을 받고 응답을 보내는 지 확인할 수 있습니다. 방화벽을 사용하지 않는 두 경우 모두 똑같은 시스템에서 실행되며 정확히 동일한 코드가 두 번 실행되었습니다.

Java 7에서 변경된 사항이 있습니까? 더 심각한 결함이 있습니까? 아니면 단순히 Java 버그입니까?

다음은 코드를 약간 제거한 버전입니다.

public static void main(String[] arguments) throws Exception { 
    InetAddress server = InetAddress.getByName(serverAddress); 
    Socket sock = SSLSocketFactory.getDefault().createSocket(server.getHostAddress(), port); 
    InputStream in = sock.getInputStream(); 
    OutputStream out = sock.getOutputStream(); 
    out.write(command.getBytes()); //Is valid command 
    String token = ""; 
    responseReader: while (true) { 
    try { 
     Thread.sleep(1); 
    } 
    catch (InterruptedException exception) {} 
    byte[] d = new byte[in.available()]; 
    int avail = in.read(d); 
    for (int i = 0; i < avail; i++) { 
     if (d[i] == fieldSeperator) { 
     token = ""; 
     } 
     else if (d[i] == commandSeperator) { 
     break responseReader; 
     } 
     else { 
     token += (char) d[i]; 
     } 
    } 
    } 
} 

내가 생각할 수있을만큼 많이 시도했지만, 대부분의 시간이 중요하지 않다는 것을 알고 있습니다. 스트림을 읽는 다른 방법을 사용하고, SSLSocket에 캐스팅하고 다른 호출을하고, 몇 가지를 추가합니다.

+0

서버는 어떻게 작동합니까? 출력을 쓴 직후 소켓을 닫습니까? – partlov

+0

연결 끊기 명령이 전송 될 때까지 둘 다 열려 있습니다. – Swop

+0

어떻게 * 소켓이 InputStream *에서 아무것도 수신하지 않는 것으로 나타 났습니까? 디버그? 아니면 출력할까요? – Andremoniy

답변

1

코드가 잘못되었습니다. 그런 식으로 available()를 사용하면 안됩니다. 사용할 수있는 데이터가 없으면 길이가 0 인 버퍼를 할당하고 0 길이 읽기를 실행하여 블록하지 않고 0을 다시 만듭니다. 버퍼 크기에 8192와 같은 상수를 사용하고 루프 외부에 버퍼를 할당하십시오. 그리고 수면을 제거하십시오().

available()의 올바른 사용법은 거의 없으며이 중 하나가 아닙니다.

available()은 항상 SSLSocket에 대해 0을 반환하고 항상 Java 1.3 및 별도의 JSSE 다운로드로 돌아 왔습니다. 따라서 Java 6에서 동일한 코드가 작동한다는 것을 받아 들일 수 없습니다.

+0

'소켓 소켓 = SSLSocketFactory.getDefault(). createSocket'은 표준 소켓을 반환합니다. 나는 임의의 것들을 시도하면서 Java 7의 SSLSocket에 캐스트하려고했습니다. – Swop

+0

@Swop No. SSLSocket를 돌려줍니다. 그렇지 않으면 정확히 무슨 점이 있습니까? SSL을 원하지 않으면 SSL 클래스를 사용하지 마십시오. – EJP

+0

고맙습니다. 문제가 해결되었습니다. 그러나 나는 SSLSocket과 함께'in.available()'을 사용하여 Java 6에서 얻은 내용을 다시 한 번 확인했으며 유효한 0이 아닌 숫자를 반환했습니다. – Swop

관련 문제