2009-11-22 3 views
1

그에 따라 데이터가 전송 된 경우 String ack로 응답하는 EchoServer를 작성했습니다.ObjectInputStream 및 ObjectOutputStream

내 클라이언트가 다음과 같이 보입니다. 서버에서 응답을 받기 위해 "echoSocket"은 수신 된 데이터를 내 ObjectInputStream에 저장합니다. 이 부분에 대해 고객이 언급 한 경우에만

 echoSocket = new Socket(server_name, tcp_port); 
     System.out.println(" *** Connected to " + server_name + " ***"); 
     System.out.println("Press Enter to send your message."); 

     out = new ObjectOutputStream(echoSocket.getOutputStream()); 
     in = new ObjectInputStream(echoSocket.getInputStream()); 

     out.flush(); 

     String message = System.console().readLine(); 

     while(!message.equals("quit")) { 


      // problem     
      if (in.readObject().equals(ack)) 
       System.out.println("ACKed"); 
      in.close(); 
      // problem ends 
      out.flush(); 

      out.writeObject(message); 
      System.out.println("Sending: " + message);  
      message = System.console().readLine(); 
      out.flush(); 

     } 

아무도 내 문자열을 보내지 않는 이유를 알고 있습니까?

덕분에, 소켓을 통해 객체 스트림을 사용 마리우스

+0

ack는 문자열 리터럴을 의미합니까? 변경 : if (in.readObject(). equals ("ack")) – barrowc

답변

3

정말 좋습니다 생각이 아니다. 전체 웹 서비스 또는 RMI를 고려할 수 있습니다.

버퍼를 읽고 개체 스트림을 역 직렬화하려고 시도하기 전에 전체 업무를 처리하는 것이 더 효과적 일 수 있습니다.

+2

RMI는 매우 비쌉니다. 때때로 스트림 + 소켓이 더 나은 솔루션입니다. –

+0

버퍼로 읽는다면 * 더 잘 작동하지 않을 것입니다. 그런 다음 여러분은 직접 객체 경계를 관리해야합니다. 그러나 BufferedInputStream을 삽입하면 OS 수준 읽기 시스템 호출에 대한 호출 수가 줄어 듭니다. 이와 같은 테스트는 동일한 스레드에서 동일한 채널을 읽고 쓰려고 할 때 발생하는 블로킹으로 인해 종종 실패합니다. –

1

클라이언트가 메시지를 작성하기 전에 승인을 읽으려고하는 것 같습니다.

+0

나는 순서를 바꾸더라도 클라이언트가 단순히 멈춘다. 응답은 선택 사항입니다 ... 응답이 없으면 대기합니다. – wishi

+0

readObject()는 데이터가 수신 될 때까지 차단됩니다. 따라서 서버가 결코 인식하지 못하면 영원히 기다릴 것입니다. 당신은 ACK가 선택 사항이라고 말합니다 ... 필요하지 않다면 ACK를 원하는 이유를 확장 할 수 있습니다. 포기하기까지 얼마나 기다려야할까요? 이 루프가 왜 신경 써야합니까? – PSpeed

+0

@wishi_ 무작위로 움직이는 것을 멈추고 무슨 일이 일어나고 있는지 생각해보십시오. @PSpeed가 말하듯이 클라이언트의 입력 스트림에서 읽기 작업을 호출하면 서버에서 데이터를 수신 할 때까지 차단됩니다. –

1

분할은 "전송"별도의 스레드에 코드를 "수신" 다른 스레드가 readObject()에 대한 호출로 차단되는 동안 작성기 스레드는 소켓에 쓸 수 있습니다.

장기 실행 클라이언트가 될 경우 ObjectInputStream/ObjectOutputStream 대신 하위 수준의 DataInputStream 및 DataOutputStream을 사용하여 개체의 가능한 큰 IdentityHashmap을 보유하지 못하도록하는 것이 좋습니다.

관련 문제