2011-10-01 3 views
6

나는 정말로 바보 같은 느낌이 들었다 .... 기본적으로 로컬 컴퓨터의 TCP를 통해 연결하고있다. 그리고 클라이언트에서 In/Out 스트림을 만들려고 할 때 생성이 이루어지지 않을 것이다. 객체 입력 스트림 뭐라 구요? 이것은 2를 인쇄 한 후에 중단됩니다 ... 예외 나 기타 ...이 클래스를 사용하여 처음으로 부분적으로 왜 내가 의아해하는지는 아닙니다. ObjectInputStream에의 specification 가입일Java ObjectInputStream hanging

try { 
      System.out.println("1"); 
      mySocket = new Socket("localhost", 11311); 
      System.out.println("12"); 
      oos = new ObjectOutputStream(mySocket.getOutputStream()); 
      System.out.println("2"); 
      ois = new ObjectInputStream(mySocket.getInputStream()); 
      System.out.println("13"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

서버에서 개체를 보내고 있습니까? 그것은 서버가 아무것도 보내지 않는 것 같습니다. – MasterCassim

+0

'ObjectInputStream'은 아마도 스트림 헤더가 수신되기를 기다릴 것입니다. – NiematojakTomasz

+0

다음과 같이하지 않습니다 ... 서버가 TCP 연결을 허용합니다. 나는 당신이 ois.readObject()를 읽을 것이라고 생각했습니다. 클라이언트가 첫 번째 개체를 보내도록 설정했습니다 ... 단지 스트림을 만들고 싶었습니다. – Michael

답변

6

: 해당 ObjectOutputStream를 작성하고, 헤더를 플러시 할 때까지

이 생성자 차단할 것이다.

1

(미래의 독자를 위해 :) 서버 프로그램에서 바보 같은 변화를 만들었고 오랜 시간 동안 테스트하지 않았기 때문에 나는 프로그램이 잠긴 이유에 대해 혼란 스러웠다.

ServerSocket

는 부적합한 if에 갑자기 연결 ( responderSocket = serverSock.accept();) 받아 (내가 언급 한 바보 변화를!) 프로그램이 스레드의 점프와 내가 스트림을 닫을 수 finally 블록을 추가하고 소켓하지 않았기 때문에 소켓이 남아 있었다 버려진 (아무것도 스트림 헤더) 아무것도 보내거나받지 않고. 그래서 클라이언트 측 프로그램에서 더 스트림 헤더가 없었다 (내가 잠금 전에 마지막으로 실행 기능 것을보고 코드를 debbugged 경우 :

public ObjectInputStream(InputStream in) throws IOException { 
    verifySubclass(); 
    bin = new BlockDataInputStream(in); 
    handles = new HandleTable(10); 
    vlist = new ValidationList(); 
    enableOverride = false; 
    readStreamHeader();     //// <== This function 
    bin.setBlockDataMode(true); 
} 

readStreamHeader();)

그래서 서버 측에서 일어나는 일에 대해주의, 아마 문제는 당신이 그것을 기대하는 곳이 아닙니다!

+3

처음에는 accept() 루프에서 객체 스트림을 생성하지 않아야합니다. 연결 처리 스레드의 run() 메소드에서 구성해야합니다. 그렇지 않으면 스트림 헤더에 대한 I/O에서 accept() 루프를 차단하여 더 많은 클라이언트를 차단할 위험이 있습니다. – EJP