2017-04-19 13 views
-1

현재 내가 문제를 직면하고있어하지만 난 대답을 예상받지 못했습니다 .. 아래는 내 예제 코드입니다 : -마지막 행 공간 스트림 작성기를 제거하는 방법은 무엇입니까? , 내가 StreamWriter 클래스를 사용하여 텍스트 내용을 쓰기 위해 노력하고있어 파일을 만드는 동안

내 C# 코드는 같다

#EXTM3U 
#EXT-X-VERSION:3 
#EXT-X-STREAM-INF:BANDWIDTH=20776,CODECS="avc1.66.41",RESOLUTION=320x240 
chunk.m3u8?nimblesessionid=62 
&token=42712adc-f932-43c7-b282-69cf349941da 

하지만 내 예상 출력 : - -이 : -처럼 위의 코드의

public void ProcessRequest(HttpContext context) 
    { 
     // Create a connexion to the Remote Server to redirect all requests 
     RemoteServer server = new RemoteServer(context); 

     // Create a request with same data in navigator request 
     HttpWebRequest request = server.GetRequest(); 

     // Send the request to the remote server and return the response 
     HttpWebResponse response = server.GetResponse(request); 
     context.Response.AddHeader("Content-Disposition", "attachment; filename=playlist.m3u8"); 
     context.Response.ContentType = response.ContentType; 

     Stream receiveStream = response.GetResponseStream(); 
     var buff = new byte[1024]; 
     int bytes = 0; 
     string token = Guid.NewGuid().ToString(); 

     while ((bytes = receiveStream.Read(buff, 0, 1024)) > 0) 
     { 
      //Write the stream directly to the client 
      context.Response.OutputStream.Write(buff, 0, bytes); 

      context.Response.Write("&token="+token); 
     } 
     //close streams 
     response.Close(); 
     context.Response.End(); 
    } 

출력이 보이는

,
#EXTM3U 
#EXT-X-VERSION:3 
#EXT-X-STREAM-INF:BANDWIDTH=20776,CODECS="avc1.66.41",RESOLUTION=320x240 
chunk.m3u8?nimblesessionid=62&token=42712adc-f932-43c7-b282-69cf349941da 

난 그냥 대신 새로운 라인의 같은 라인에서 해당 토큰 PARAM ..

가 감사를 원했다.

+1

서버에서받은 데이터가 이미 개행 문자로 끝나지 않았습니까? 그렇다면'context.Response'에 쓰기 전에 필터링해야합니다. – jcb

+0

@jcb 데이터를 바이트 단위로 가져 오는 중입니다. 파일에 기록하기 전에 어떻게 필터링 할 수 있습니까? 예제 코드를 제공해 줄 수 있습니까? – IPS

+0

당신은'if (buff [bytes-1] == 0x0a) bytes - = 1;'과 같은 일을 할 수 있는데, 이것은 개행 문자 (0x0a가 16 진수라면 '\ n')가 당신이받은 마지막 바이트, 그리고 마치 1 바이트 적게받은 것처럼 행동합니다. 그러나 서버에 따라 캐리지 리턴 바이트 ('\ r'또는 0x0d) 또는 메시지의 끝으로 둘 다 나타날 수 있습니다. 필요에 따라 적응 :) – jcb

답변

2

단순히 수신 된 바이트의 끝에 줄 바꿈을 제거하려면, 다음처럼 while 루프의 코드를 변경합니다

while ((bytes = receiveStream.Read(buff, 0, 1024)) > 0) 
{ 
    if (buff[bytes-1] == 0x0a) 
     bytes -= 1; 

    //Write the stream directly to the client 
    context.Response.OutputStream.Write(buff, 0, bytes); 

    context.Response.Write("&token="+token); 
} 

몇 가지주의 사항 :

  • 그것은 의지에만 작동 0x0a (줄 바꿈 문자, 문자로 '\n')이있는 경우 을받은 바이트의 끝에 있습니다. 어떤 이유로 서버가 보낸 메시지가 여러 블록으로 수신되면 먼저 마지막 바이트를 확인하기 전에 수신 할 모든 것을 수신했는지 확인해야합니다. 이로 인해 현재 코드에 &token=... 줄이 여러 개 나타납니다.
  • 서버에 따라 줄 바꿈 바이트로 캐리지 리턴 (0x0d 또는 '\r')을 사용하거나 둘 다 사용할 수 있습니다. 서버가 무엇을 전송하는지 확인하고 적절하게 코드를 수정하십시오.
+0

OP가 실제로 1024 바이트마다 토큰을 쓰고 싶지 않기 때문에 다소 복잡 할 수 있습니다. 그 현재의 형식 –

+0

Accepted answer, very thank you :) – IPS

+1

@ kevin-gosse : 그렇습니다. 그 취지에 대한 제 의견 : 당신 말이 맞습니다.이 질문에 엄격하게 대답하고 있습니다. 가능한 모든 문제를 다루지 않습니다.나는 SO 연습과 관련하여 거기에 얼마나 멀리 갈지 확신하지 못했다. – jcb