2011-11-19 21 views
7

Estoy desarrollando un servidor WebSocket con C# y noté que todos los mensajes que provenían del navegador (Chrome en ese caso) utilizando el método send() tienen una longitud máxima de 126 caracteres. Ocurre todo el tiempo cuando quiero enviar mensajes de un tamaño mayor a 126 caracteres, parece que el protocolo corta cualquier mensaje más grande que 126 caracteres y transfiere solo los primeros 126 caracteres. Traté de verificar la definición del protocolo pero no encontré ninguna respuesta.¿Cómo puedo enviar mensajes más grandes a través de WebSocket?

Entonces, mi pregunta es, ¿puedo enviar mensajes más grandes a través de WebSockets?

ACTUALIZACIÓN: Esta es la forma en que estoy analizar los mensajes del cliente (cromo) en mi servidor de C# WebSocket:

private void ReceiveCallback(IAsyncResult _result) 
    { 
     lock (lckRead) 
     { 
      string message = string.Empty; 
      int startIndex = 2; 
      Int64 dataLength = (byte)(buffer[1] & 0x7F); // when the message is larger then 126 chars it cuts here and all i get is the first 126 chars 
      if (dataLength > 0) 
      { 
       if (dataLength == 126) 
       { 
        BitConverter.ToInt16(buffer, startIndex); 
        startIndex = 4; 
       } 
       else if (dataLength == 127) 
       { 
        BitConverter.ToInt64(buffer, startIndex); 
        startIndex = 10; 
       } 

       bool masked = Convert.ToBoolean((buffer[1] & 0x80) >> 7); 
       int maskKey = 0; 
       if (masked) 
       { 
        maskKey = BitConverter.ToInt32(buffer, startIndex); 
        startIndex = startIndex + 4; 
       } 

       byte[] payload = new byte[dataLength]; 
       Array.Copy(buffer, (int)startIndex, payload, 0, (int)dataLength); 
       if (masked) 
       { 
        payload = MaskBytes(payload, maskKey); 
        message = Encoding.UTF8.GetString(payload); 
        OnDataReceived(new DataReceivedEventArgs(message.Length, message)); 
       } 

       HandleMessage(message); //'message' - the message that received 

       Listen(); 
      } 
      else 
      { 
       if (ClientDisconnected != null) 
        ClientDisconnected(this, EventArgs.Empty); 
      } 
     } 
    } 

Todavía no entiendo cómo puedo obtener mensaje más amplio, tal vez sea algo con el código de operación, pero no sé qué cambiar para que funcione?

Respuesta

6

Los mensajes de WebSocket pueden ser de cualquier tamaño. Sin embargo, los mensajes grandes generalmente se transmiten en varias partes (fragmentos) para evitar el bloqueo de cabecera de línea. Vea el WebSockets I-D para más detalles.

+0

Escribí en mi pregunta que había estado allí y no encontré ninguna respuesta, ¿puede ser más específico, por favor? – udidu

+0

[Sección 5.4] (http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.4) – dtb

+0

¿Puede ayudarme con eso? cualquier pseudo código que me ayude a recibir mensajes de gran tamaño estará agradecido. – udidu

0

Eso no es correcto lo que dijiste DTB. El envío definitivamente debería soportar más de 126 caracteres. Es una cuestión de formatear correctamente su salida. Si estuviéramos limitados a 126 caracteres, no habría servidores de señalización para WebRTC. Codificaré esta función de enviar mensaje y la publicaré aquí cuando termine.

2

Sé a ciencia cierta que puede enviar mensajes de más de 126 caracteres,
Puedo enviar datos a través de protobuf que contiene cadenas que a su vez contienen 126 caracteres. http://www.websocket.org/echo.html
Si mira este sitio web puede probar sus mensajes. (Tenga en cuenta que esto no usa fragmentos)

+0

Sí, traté de enviar 524k bytes y solo obtuve 131k a cambio: http://i.stack.imgur.com/aDh9O.png – Pacerier

Cuestiones relacionadas