2017-01-28 4 views
2

WebSocket 서버에 연결하고 알 수없는 크기의 JSON 응답을받는 C# 응용 프로그램을 작성하고 있습니다. 이 목적으로 ClientWebSocket 클래스를 사용하고 있습니다.WebSocket 응답에 대한 버퍼 크기 선택

var client = new ClientWebSocket(); 
client.ConnectAsync(new Uri($"ws://localhost:{port}"), token).Wait(); 
var result = new ArraySegment<byte>(new byte[1000]); 
client.ReceiveAsync(result, token).Wait(); 

문제는 내가 알고하지 않기 때문에, 얼마나 큰 json으로 :

클라이언트로부터 데이터를 수신 할 수있는 유일한 방법은 인수로 ArraySegment<byte> 걸리는 ReceiveAsync 방법으로 보인다 응답은, 그 ArraySegment를 뒷받침하는 버퍼를 얼마나 크게 만들지 모르겠다. 이 경우 1000 바이트를 너무 작게 지정했으며 응답이 잘립니다. 그러나 버퍼 크기를 임의로 (1,000,000 바이트?)로 설정하면 필요한 메모리보다 더 많은 메모리를 사용하게 될까봐 걱정됩니다.

응답 크기를 모른 채 버퍼 크기를 선택하려면 어떻게해야합니까?

답변

3

API를 올바르게 이해하면 필요한 경우 여러 부분에 websocket 메시지가 표시됩니다. 서버에서 보낸 메시지가 2048 바이트이며 1024 바이트 버퍼를 사용 할 경우 의미

:

var buffer = new ArraySegment<byte>(new byte[1000]); 
var result = await client.ReceiveAsync(buffer, token); 

그런 다음이 첫 번째 호출 result.Count 1000으로 설정하고 result.EndOfMessage가 설정됩니다에서 false. 즉, EndOfMessage이 true로 설정 될 때까지 계속 읽어야 함을 의미합니다.이 예에서는 3 회의 읽기를 의미합니다.

모든 버퍼가 필요하고 메시지 조각을 개별적으로 처리 할 수없는 경우 결과가 더 많은 데이터가 들어 오면 작은 버퍼로 시작하고 수신 버퍼의 크기를 조정할 수 있습니다. 최대 크기를 초과하면 수신이 중지되는지 확인하십시오.

var buffer = new byte[1000]; 
var offset = 0; 
var free = buffer.Length; 
while (true) 
{ 
    var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer, offset, free), token); 
    offset += result.Count; 
    free -= result.Count; 
    if (result.EndOfMessage) break; 
    if (free == 0) 
    { 
     // No free space 
     // Resize the outgoing buffer 
     var newSize = buffer.Length + xyz; 
     if (newSize > maxFrameSize) 
     { 
      throw new Exception ("Maximum size exceeded"); 
     } 
     var newBuffer = new buffer[newSize]; 
     Array.Copy(buffer, 0, newBuffer, 0, offset); 
     buffer = newBuffer; 
     free = buffer.Length - offset; 
    } 
} 

물론 당신은 또한 MessageType 같은 수신 결과의 다른 필드를 확인해야합니다.