A common approach to protocols like this (or others where you may have 
different versions of the protocol that are parsed differently), is to have 
a simple handler that detects which version of the protocol is in use, then 
replaces itself with the appropriate protocol specific handler.

Take a look at the socksx package for an example of a handler that detects 
the version of the protocol in use, and adds an appropriate ChannelHandler:

https://netty.io/4.1/api/io/netty/handler/codec/socksx/SocksPortUnificationServerHandler.html

Hope this helps.

Rogan


On Saturday, 20 February 2021 at 09:09:39 UTC+2 [email protected] wrote:

> I have odd protocol where responses to commands are of the form
>
> case 1: <STX><ASCII DATA><ETX><Checksum>
> case 2: <0x06>
> case 3: <0x15>
>
> which is proving to be a bit challenging to do with Netty without doing a 
> bunch of byte by byte copying. I have my naive ByteToMessageDecoder read 
> one byte and upon inspection of the byte decide how to progress. My 'frame' 
> that I send up to the next layer in the pipeline is a nio buffer which 
> either contains a single byte (cases 2 or 3) or the entirety of the message 
> (<STX>....<Checksum>) for case 1.
>
> This works fine and since I a dealing with a serial transport with a 
> single connection that kind of highly iterative copying is probably of no 
> real concern. However, this doesn't feel like it is idiomatic Netty and I 
> was looking for other interesting solutions.
>
> I suppose one solution would be dynamically add a handler to the pipeline 
> in the event that the first byte in a message was an <STX> and then 
> removing that handler once it had consumed <checksum>.
>
> I could also see, if such a thing is possible, a pair of sibling (same 
> order in the pipeline) decoders: a LineBasedFrameDecoder that terminates 
> with <ACK> or <NACK>, and a subclass of LineBasedFrameDecoder that 
> terminates on <ETX> but also consumes and extra byte.
>
> So I am curious what approaches folks with more experience with Netty than 
> I would come up with.
>
>
>
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/netty/be81f3d8-66ac-4acc-8311-2d07cf20e031n%40googlegroups.com.

Reply via email to