2010-06-22 1 views
2

나는 서버에 영구적 인 (킵 얼라이브) 연결을 createst WebRequest 클래스, 예컨대 :영구 (연결 유지) 연결 인 경우 웹 요청의 endOfStream으로 이동하는 이유는 무엇입니까?

webRequest.ContentType = "application/x-www-form-urlencoded"; 
        // Set the ContentLength property of the WebRequest. 
        webRequest.ContentLength = byteArray.Length; 
        webRequest.Timeout = Timeout.Infinite; 
        webRequest.KeepAlive = true; 
        webRequest.ReadWriteTimeout = Timeout.Infinite; 
        //[System.Threading.Timeout]::Infinite 

        webRequest.UserAgent = "www.socialblazeapp.com"; 
        Stream dataStream = webRequest.GetRequestStream(); 
        // Write the data to the request stream. 
        dataStream.Write(byteArray, 0, byteArray.Length); 
        // Close the Stream object. 
        dataStream.Close(); 
        // Get the response. 
        webResponse = (HttpWebResponse)webRequest.GetResponse(); 
        Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 
        responseStream = new StreamReader(webResponse.GetResponseStream(), encode); 
        while(!responseStream.EndOfStream){ //do something} 

잠시 후 responseStream.EndOfStream true가 될 이유가 궁금하네요 있습니다. 나는 이것이 지속적인 연결이기 때문에 스트림이 닫히지 않을 것이라고 생각했을 것이다.

왜 이런 생각입니까?

답변

2

당신은 TCP 연결을 열어 놓고 응답 스트림을 열어 두는 것을 혼란스럽게 생각합니다. TCP 연결은 기본 전송 매체이지만 요청 및 응답은 해당 연결을 통해 통신되는 개별 엔티티입니다.

지속적 연결을 사용하면 동일한 연결에서 여러 요청/응답 쌍을 발행 할 수 있습니다. 지속적인 연결이 없다면 본질적으로 연결을 열어서 요청을 보내고 응답을받은 다음 연결을 닫은 다음 후속 요청/응답 쌍에 대해 해당 프로세스를 반복하십시오.

응답 자체는 크기가 한정되어 있지만 완료된 응답을 받으면 스트림은 더 이상 알려줄 것이 없어 닫아야합니다. 다른 요청을 발행하면 다른 응답이 이어집니다. .NET이 기본 영구 연결을 다시 사용할 것인지 여부는 확실하지 않습니다.

+0

말이 맞습니다. 그래서 몇 시간 동안 웹 서버에 대한 연결을 유지하고 싶다고합시다. 데이터 스트리밍 전체 시간), 내가 어떻게 그것을 달성하겠습니까? – rksprst

+0

여기에있는 질문과 다른 대답을 바탕으로 스트리밍 및 연결 지속성의 개념을 오해하고 있다고 생각합니다. 연결 유형에 관계없이 HTTP는 요청/응답 대화입니다. 당신은 항상 유한 한 요청을 발행 할 것이고, 서버는 항상 당신에게 유한 반응을 줄 것이다. 이것은 그 응답의 끝이 있음을 의미한다. 당신이 찾고있는 것은, 내가 이해할 때 (그리고 내가 틀렸다면 나에게 올바른) 기본적으로 단일 응답 스트림 변수를 가지고 반복적으로 사용할 수있는 방법입니다. 당신은 그렇게 할 수 없을 것입니다. – CodingGorilla

+0

내가하려고하는 것은 Twitter의 스트리밍 API (http://dev.twitter.com/pages/streaming_api)에 연결하는 것입니다. "연결"섹션 아래에이 작업을 수행 할 수 있어야한다는 내용의 텍스트가 있습니다 HTTP를 통해 스트리밍 API에 연결합니다. HTTP를 통해 응답 스트림을 열어 둘 수 없다면 Twitter에서 연결을 유지하는 방법을 알 수 없습니까? 또는 나는 다시 뭔가를 오해하고 있는가? – rksprst

1

TCP 연결을 계속 열어두면됩니다. 이 정보를 올바르게 읽으면 해당 서버에 대한 여러 요청에 대해 동일한 실제 TCP 연결을 다시 사용할 수 있습니다. 서버가 추가 정보를 보낼 수 있도록 스트림을 열어 두는 것입니다.

스트리밍 데이터를 원한다면 다른 프로토콜이나 스트레이트 TCP를 사용해야합니다.

+0

완전한 데이터 스트리밍을 보여주는 예제가 있습니까? – rksprst

+0

기본적으로 TCP에 대한 예제가 있지만, 여기에 적절한 출발점이 있습니다. http://www.codeproject.com/KB/IP/socketsincsharp.aspx –

+0

나는 이것을 Twitter의 스트리밍 API (http://dev.twitter.com/pages/streaming_api)에 사용하고있다. HTTP 연결. 읽기 스트림을 HTTP 연결로 영구 저장하는 방법이 있습니까? 방금 응답 스트림을 다시 얻으려고했지만 새로운 연결이 이루어진 경우에만 작동합니다. – rksprst