Great, thank you so much, that helps heaps

I'll give it a shot but seems to make sense so far

Conrad



darose wrote:
> 
> Conrad Congrene wrote:
>> Hi everyone
>> 
>> I'm fairly new to MINA and have created a server which will receive 
>> text-based commands. Using the TextLineCodecFactory as the 
>> ProtocolCodecFilter seems to do the job well.
>> 
>> Say that I wanted to modify the server to accept byte-based commands 
>> aswell (or just pure byte commands and then converted to a string), what 
>> codec/filter can I add? Do I have to create one?
> 
> I did this on a server recently.  We have both text-based and 
> binary-based protocols running on it (on different ports).  What I had 
> to do was write:
> 
> * a new "BinaryCodecFactory", which instantiates:
> 
>       * a "BinaryProtocolDecoder" (which converts incoming bytes into a 
> "message" object), and
> 
>       *a "BinaryProtocolEncoder" (which converts outgoing "response" objects 
> back into bytes
> 
> * and a "BinaryProtocolHandler" (which responds to the incoming messages 
> that the decoder creates.
> 
> e.g.:
> 
> public class CacheServer {
> ...
>               protocolAcceptor = new NioSocketAcceptor();
>               protocolAcceptor.setDefaultLocalAddress(new 
> InetSocketAddress(protocolPort));
>               DefaultIoFilterChainBuilder filterChainBuilder = 
> protocolAcceptor.getFilterChain();
>               filterChainBuilder.addLast("codec", new 
> ProtocolCodecFilter(BinaryCodecFactory(this, cacheNode)));
>               protocolAcceptor.setHandler(new BinaryProtocolHandler());
> ...
> }
> 
> public class BinaryCodecFactory implements ProtocolCodecFactory {
>       public BinaryCodecFactory(CacheServerControl serverControl, CacheNode 
> cacheNode) {
>               encoder = new BinaryProtocolEncoder();
>               decoder = new BinaryProtocolDecoder(serverControl, cacheNode);
>       }
>       public ProtocolDecoder getDecoder(IoSession session) throws Exception {
>               return decoder;
>       }
>       public ProtocolEncoder getEncoder(IoSession session) throws Exception {
>               return encoder;
>       }
>       private ProtocolEncoder encoder;
>       private ProtocolDecoder decoder;
> }
> 
> public class BinaryProtocolEncoder implements ProtocolEncoder {
> ...
> }
> 
> public class BinaryProtocolDecoder extends CumulativeProtocolDecoder {
> ...
> }
> 
> public class BinaryProtocolHandler extends IoHandlerAdapter {
> ...
> }
> 
> 
> Trickiest part about this setup was writing the BinaryProtocolDecoder. 
> Bytes get delivered in chunks, so you are not guaranteed that a call to 
> decode will pass you all of the bytes needed to decode a message.  So 
> you need to a) account for this situation and not throw an error, and b) 
> make sure you save the bytes that make up the first part of a message so 
> that you will be able to decode the full message once the second part 
> gets delivered.  Use CumulativeProtocolDecoder here - it helps simplify 
> this process a lot.
> 
> HTH,
> 
> DR
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Byte---Textline-codec-filter-tp23919078p23934534.html
Sent from the Apache MINA User Forum mailing list archive at Nabble.com.

Reply via email to