Be careful of intermingled control frame (ping, close, pong) during the fragments that make up the message. And pay attention to the FIN flag.
Example: TEXT (fin=false) [start of message] CONTINUATION (fin=false) PING CONTINUATION (fin=true) [end of message] BTW, this has been greatly overhauled in jetty-9 (currently in active pre-alpha development, we working diligently towards our milestone cycle, stay tuned) -- Joakim Erdfelt <[email protected]> www.webtide.com Developer advice, services and support from the Jetty & CometD experts. On Thu, Sep 13, 2012 at 12:17 PM, Brandon Mintern <[email protected]>wrote: > With a little trial-and-error, and some time looking at RFC 6455, I > think that I've mostly answered my own question. My class now looks > something like this (this is a greatly simplified version): > > abstract public class MyWebSocket implements WebSocket, > WebSocket.OnTextMessage, WebSocket.OnFrame { > private static final byte CONTINUATION_FRAME = 0; > private static final byte BINARY_FRAME = 2; > > private boolean processingBinaryFrame; > > @Override > public boolean onFrame(byte flags, byte opcode, byte[] data, int > offset, int length) { > if (opcode == BINARY_FRAME || (processingBinaryFrame && opcode > == CONTINUATION_FRAME)) { > processingBinaryFrame = true; > onBinaryMessage(data, offset, length); > return true; > } > return false; > } > > @Override > public void onHandshake(FrameConnection connection) { > // I don't think we need to do anything special here > } > > @Override > public void onMessage(String data) { > processingBinaryFrame = false; > onTextMessage(data); > } > > protected void onBinaryMessage(byte[] data, int offset, int length) { > throw new IllegalArgumentException(getClass() + " cannot > receive a binary message."); > } > > protected void onTextMessage(String data) { > throw new IllegalArgumentException(getClass() + " cannot > receive a text message."); > } > } > > Other than the poor form of hard-coding the CONTINUATION_FRAME and > BINARY_FRAME values when there are FrameConnection methods to check > for those opcodes, is there anything wrong with my approach? Are there > edge cases that my implementation misses? > > Thanks, > Brandon > > On Thu, Sep 13, 2012 at 11:36 AM, Brandon Mintern <[email protected]> > wrote: > > I'm building an application using Jetty WebSockets that sends a very > > large stream of binary from the client to the server. That is, it's a > > streaming upload that involves several Javascript calls to > > connection.send(block), where each block is an ArrayBuffer of up to 1 > > MB in size. This is done completely asynchronously, so that a > > subsequent call to connection.send does not occur until a prior one > > completes successfully. > > > > On the other end, I've (so far) implemented OnBinaryMessage and > > OnTextMessage. It was working pretty well, but during testing I was > > seeing messages to the effect of "binary frame aggregation disabled." > > During onOpen, I tried calling connection.setMaxBinarySize(2048*512), > > but this failed as well. When I doubled that size, it worked, but it > > seems silly to allocate 2 MB when I might need as little as 512 bytes, > > and it definitely feels like I'm solving the wrong problem at this > > point. > > > > On the server side, I really don't need any aggregation at all; I'm > > simply writing data[offset:offset+length] to a PipedOutputStream, > > where the input side is read by another thread. What is the best way > > to simply pass off binary data in this way, without performing any > > aggregation? It seems that I need to implement WebSocket.OnFrame, but > > I could not find any helpful documentation for it. Can I simply return > > false if it is a text frame, and handle it if it is a binary frame? > > How do I check opcode to determine whether it is binary? If I'm > > handling binary messages using an onFrame method, do I no longer need > > to implement OnBinaryMessage? Do I need to do anything special with > > the flags argument? When is onHandshake called? Is there anything that > > must be done there? > > > > Thank you for any insight you can give me. If you can simply point me > > to documentation (the source as downloaded via maven has none), I'm > > happy to dig into it myself. > > > > Cheers, > > Brandon > _______________________________________________ > jetty-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/jetty-users >
_______________________________________________ jetty-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users
