How can I send larger messages over WebSocket?
Solution 1
WebSocket messages can be of any size. However, large messages are usually transmitted in multiple parts (fragments) to avoid head-of-line blocking. See the WebSockets I-D for details.
Solution 2
I know for a fact that you can send messages larger than 126 characters,
I am able to send data over protobuf that contains strings that themselves contain 126 characters.
http://www.websocket.org/echo.html
If you look at this website you can test out your messages. (Note this does not use fragments)
udidu
Updated on June 27, 2022Comments
-
udidu almost 2 years
I am developing a WebSocket server with C# and I noticed that all the messages that coming from the browser (Chrome in that case) using the send() method are 126 chars length max. It happens all the time when I want to send messages larger that 126 chars, looks like the protocol cuts any message larger then 126 chars and transfer only the first 126 chars. I tried to check on the protocol definition but didn't find any answer.
So, my question is, can I send larger messages over WebSockets?
UPDATE: This is the way that I'm parsing the messages from the client (Chrome) in my C# WebSocket server:
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); } } }
I still didn't understand how can I get larger message, its maybe something with the opcode, but I don't know what to change to make it work?
-
udidu over 12 yearsI wrote in my question that I had been there and didn't found any answer, can you be more specific please?
-
Feidex over 12 years
-
udidu over 12 yearsCan you help me with that? any pseudo code that will help me receive large size messages will be thankful..
-
Triynko over 10 yearsSeems there is a 2GB limit in some implementations: "So we might want to mention in our docs that we currently support up to 2 GB Web Socket messages, both incoming/outgoing. That's the theoretical limit--malloc is sure to fail on mobile for such sizes, in which case (as spec mandates) the websocket is failed." - bugzilla.mozilla.org/show_bug.cgi?id=711003
-
Pacerier about 9 yearsYes I tried sending 524k bytes and only got 131k in return: i.stack.imgur.com/aDh9O.png
-
tresf over 8 yearsI'm not sure the relevance, but this article (linked below) mentions a 125 byte limitation which sounds familiar to the OP's problem. Shouldn't a properly written websocket class already take this into consideration? stackoverflow.com/a/9358640
-
AnthonyD973 about 5 yearsThis should be a comment, not an answer.