2014-04-27 2 views
0

클라이언트 프로그램과 서버 프로그램이 있습니다. 512 바이트 패킷을 보내고 일부 파일을 보내려고합니다. 전송이 완료되면 서버는 어떻게 알 수 있습니까?클라이언트 및 서버 Java 프로그램. 전송 종료를 감지하는 방법

서버 프로그램이 실행을 중지하기 전에 일부 파일을 받기를 원합니다.이 파일을 구별하고 싶습니다. 내가하고 싶은 것은 패킷의 수를 수신 출력입니다 :

패킷 번호 1

패킷 번호 2

를 수신 한 수신했습니다.

.

는 N은

접수되었으며 I이 파일을 수신하면, I는 I 파일이 완전히 전송 될 때 검출 할 것을 의미 0이 카운터 변수를 설정할 수

패킷 (덜받을 수단 512 바이트보다 큼). 클라이언트 프로그램에서받은 바이트 수를 계산할 수있는 방법이 있습니까? 가장 좋은 방법은 무엇입니까? 바이트 배열을 사용하고 있습니다.

+0

어떤 종류의 프레임을 만들어야합니다. – user2864740

+0

UDP 소켓을 사용해야합니까/사용해야합니까? 그리고 "패킷"은 512 바이트 크기 여야합니까? TCP가 대신 사용된다면, 이렇게 작은 개별 패킷을 생성 할 필요가 있기 때문에 많은 더러운 작업이 처리됩니다. (UDP를 사용하면 순서가 틀린 패킷이나 패킷이 끊긴 것과 같은 사례를 찾아 내고 관련 재 요청을해야합니다.) – user2864740

답변

-1

가장 좋은 방법은 구분 기호를 도입하는 것입니다. 이것은 귀하의 프로토콜의 일부가 될 것입니다.

파일을 보낼 때 데이터를 보냅니다.

String END_OF_MESSAGE = "ENDOFMESSAGE"; 

if(input.equals(END_OF_MESSAGE)) { 
    // You know the client has finished their transmission. 
} 

:에 보내는 더 이상 바이트가없는 경우, 클라이언트는 더 이상 데이터가 코드에서 다음 보낼하는이 있음을 나타내는 서버에 END_OF_MESSAGE 값을 보낼 것입니다, 당신은 무언가 같이있어 참고 : 나는 그보다 훨씬 더 복잡한 END_OF_MESSAGE을 만들 것입니다. 이는 데모 용입니다.

편집

JB Nizet가 제안한 것처럼, 또 다른 옵션은 다른 어떤 전에 파일의 길이를 보내는 것입니다. 이렇게하면 전송 된 바이트 수가 미리 설정된 크기와 같거나 클 때 서버에서 전송이 완료되는 시점을 알 수 있습니다.

+3

이것은 최선의 방법이 아닙니다. 파일에 "ENDOFMESSAGE"가 있으면 어떻게합니까? 단순히 파일의 길이를 먼저 보낸 다음 파일을 보내지 않는 이유는 무엇입니까? –

+0

그게 옵션이지만, "ENDOFMESSAGE"가 예제의 용도로만 사용되었다고 설명하는 맨 아래에 텍스트를 적어두면 파일의 내용이 문제가되어서는 안됩니다. 사용자는 파일의 길이를 보낼 수도 있습니다. 이것은 편집에 포함될 것입니다. – christopher

관련 문제