2012-02-22 5 views
0

나는 서버 클라이언트 응용 프로그램을 가지고 있으며 "로그인 실패 코드"와 함께 이상한 속도 범프를 쳤습니다.자바 소켓 보내지 않은 바이트

로그인의 유효성을 설명하는 코드를 보내고 필요한 경우 OutputStream을 닫으십시오. 이 문제는 클라이언트가 응답을 읽을 수 있기 전에 소켓이 닫혀있는 것으로 보입니다. 이는 무작위 적으로 발생하는 일시적인 오류로 이어질 수 있습니다.

setSoLinger() (등)을 사용하는 것 외에 클라이언트에서 마지막 바이트 (또는 그 이상)를 읽었는지 확인하는 방법이 있습니까?

감사합니다. 자바에서

+0

['close()'] (http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#close()) 또는 ['shutdownOutput()'] (http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#shutdownOutput())을 사용하여 스트림을 닫으시겠습니까? – sarnold

+0

'이 문제는 클라이언트가 응답을 읽을 수 있기 전에 소켓이 닫히기 때문에 무작위로 발생하고 숨겨진 오류가 발생합니다.' 설명해주십시오. 대개 네트워크에 장애가 발생하지 않는 한 보내는 모든 것은 손상되지 않은 상태로 수신됩니다. – EJP

답변

1

, 서버 응용 프로그램이 클라이언트가 무엇인가를받은 것을 알 수있는 유일한 방법입니다 프로토콜에서이 등록 포함 사항 : 클라이언트와 아마 (는 수신 된 데이터를한다는 어떤 종류의 메시지를 전송해야합니다 어떤 종류의 체크섬을 원한다면) 서버는이 메시지를 기다려야합니다. 그래야만 아무 것도 확신 할 수 있습니다.

다른 엔드 포인트가 일부 데이터를 수신했는지 확인하는 다른 신뢰할 수있는 방법은 없습니다. 즉, .close(), 아니 .flush()이 없으면 다른 엔드 포인트에서 수신을 보장하지 않습니다.

+0

감사합니다. 시간 제한을 설정하는 것만으로도 클라이언트가 알림을 보내 게 될 것이라고 믿을 수 없습니다. 특히 악의적 인 의도에 대해 전체 지점을 알려주는 경우 특히 그렇습니다. – Whired