2012-06-03 4 views
3

Indy TIdTCPClient 인스턴스를 사용하여 웹 서버와 통신하는 Delphi 6 응용 프로그램이 있습니다. 서버가 이미지를 다시 "푸시"하기 시작하는 것처럼 스트리밍을 시작하기위한 명령을 수신하기 위해 소켓 연결을 사용하는 이미지 스트리밍 서버이기 때문에 HTTP 클라이언트를 직접 사용하지 않는 이유가 있습니다. 즉, 일반적인 HTTP POST 요청을 보내면 HTTP 응답으로 응답하고 그 직후에 JPEG 이미지 스트림을 보내기 시작합니다.Indy TIdTCPClient 인스턴스를 사용하여 응답 본문을 포함한 웹 서버에서 전체 HTTP 응답을 검색하려면 어떻게합니까?

는 이미 응답 데이터를 수신 할 저는 ReadBuffer() 방법을 사용 후 적절한 POST 요청을 공예와의 TIdTCPClient WriteBuffer() 방법을 사용하여 전송하는 방법을 알고있다. 대신에 POST 요청을 보낸 다음 Content-Length 헤더 변수가 있으면 응답 본문의 모든 바이트를 검색하는 등의 일반적인 HTTP 응답을 기다리도록 Indy에 요청해야합니다. 물론 요청을 시작할 때까지 수신 대기열의 HTTP 응답 이후에 쌓여있는 JPEG 프레임은 그대로두기를 원합니다 (즉, HTTP 응답의 JPEG 프레임을 포함하고 싶지 않습니다. 연속적인 읽기 호출을 사용하여 요청할 때까지 내 스트리밍 요청 명령).

본문 내용이 포함 된 일반적인 HTTP 응답을 완전히 검색하는 TIdTCPClient에서 호출 할 수있는 메서드가 있습니까? 나는 SendCmd()을 사용하고 LastCmdResult 부동산 (유형 : TIdRFCReply) 검사에 대해 생각 응답을하지만, 너무 응답 본문 내용을 검색하는 경우 이 있다면 나는 인디 문서에서 말할 수 없다 Content-Length 헤더 변수는 반환하는 응답의 일부로, 응답을받은 후 나머지 수신 큐를 남겨 둘지 여부를 알 수 없습니다.

스트리밍을 시작하기 위해 HTTP 요청을 한 직후에 JPEG 프레임 스트림을 푸는 HTTP 웹 서버와의 혼합 모드 상호 작용을 수행하는 가장 좋은 방법은 무엇입니까?

또한 Indy가 JPEG 프레임 WINBONDBOUDARY 문자열을 사용하여 프레임을 분할 할 경우 데이터 블록을 모으고 직접 구문 분석하지 말고 해당 기술을 공유하십시오.

+1

왜 'TIdTCPClient'를 직접 사용하고'TIdHTTP'가 아닌가요? 'TIdHTTP'는 당신을위한 응답을 처리하며 약간의 추가 작업으로 스트리밍 데이터를 읽을 수 있습니다. (기본적으로 스트리밍 데이터를 지원하지 않습니다.) –

+0

@RemyLebeau - 로봇에 반복적 인 HTTP 명령을 보내야합니다. 명령들 사이에 약간의 일시 정지가 있으면 모터가 감기고 부드럽게 움직이는 것을 불가능합니다. 원래 TIdHTTP 구성 요소를 사용했지만 다른 게시물에서 나에게 준 유지 팁은 있지만 응답이 충분하지 않습니다. 때로는 즉시 반환되고, 응답을 받으려면 200-500, 심지어 3000 밀리 초가 걸립니다. 이것은 모두 배경 스레드에 있습니다. TIdTCPClient로 전환하고 HTTP 핸드 셰이 킹을 직접 처리하면 모든 문제가 사라졌습니다. –

+1

최신 버전의 Indy를 사용하고 있다면 'TIdHTTP.HTTPOptions' 속성이 너무 오래 전에 응답 지연을 다루는 새로운'hoWaitForUnexpectedData' 플래그로 업데이트되지 않았습니다. 플래그가 비활성화되어 있는지 확인하십시오. –

답변

2

HTTP 응답을 읽을 수있는 올바른 방법은 먼저, 다음에 그 헤더를 사용할 수있는 CRLF + CRLF 순서 일명 라인 별 빈 줄 때까지이 발생되고 CRLF로 구분 된 응답 헤더를 읽는 것입니다 나머지 응답 데이터를 읽는 방법을 결정하십시오. 헤더는 어떤 종류의 스트림이 (Content-Type 헤더를 통해) 전송되는 것뿐만 아니라 데이터가 프레임되는 방식 (Content-Length, Transfer-Encoding: chunked, 특정 Content-Type에 특정한 것 등)을 알려줍니다.

헤더를 수신하려면 연결의 Capture() 메서드를 사용하고 ADelim 매개 변수를 빈 문자열로 설정하면됩니다.

나중에 나머지 데이터를 읽는 방법은 스트림의 실제 형식/프레임에 따라 다릅니다. 어떤 종류의 스트림을 수신하고 있는지 정확히 알지 못하면 HTTP 서버에서 사용되는 여러 가지 유형의 스트리밍 프로토콜이 있으므로이를 읽는 것이 가장 좋은 방법을 알려줄 방법이 없으며 대부분 표준화되지 않았습니다. 그 정보를 제공 한 다음 Indy와 함께 구현하는 방법을 보여줄 수 있습니다.

SendCmd() HTTP 프로토콜은 해당 방법과 호환되는 방식으로 응답을 형식화하지 않으므로 SendCmd()을 사용할 수 없습니다.

+0

응답 스트림은 간단한 헤더 만의 응답이거나 길이가 Content-Length 헤더 변수에 의해 지정된 본문이있는 응답입니다. 단순히 변수를 읽은 다음 (존재하는 경우) 그 많은 바이트를 읽는 것을 차단합니다. 이제는 잘 작동합니다. –

+1

응답 본문이 있는지 확인하고 올바르게 읽는 방법에 대한 공식 규칙은 [RFC 2616 Section 4.4] (http://tools.ietf.org/html/rfc2616#section-4.4)를 읽어보십시오. –