directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sander Aiaots <>
Subject Re: [mina] ByteBuffer and MessageDecoder/MessageEncoders
Date Mon, 30 May 2005 18:31:15 GMT
Thanks for such a quick reply :)

On 5/30/05, Trustin Lee <> wrote:
> Hi Sander,
> You can get 33 bytes even if you wrote it separately.  That is nature of
> TCP/IP.  Your MesageDecoder should be able to recognize the end of message
> such as specifying the length of message in itself. 
So It clear with that :)
> I didn't get it what you're talking.  Could you please explain again? 
Well, I didn't quite catch how these ByteBuffers and Demuxing stuff
are working, anyway I can't understand why is decode called twice for
one sess.write("test");
And other problem is, that messageRecived() is not called at all ?

Test program output in screen:
begin decode>java.nio.DirectByteBuffer[pos=0 lim=4 cap=16]
end decode>java.nio.DirectByteBuffer[pos=4 lim=4 cap=16]
begin decode>java.nio.DirectByteBuffer[pos=0 lim=4 cap=16]
end decode>java.nio.DirectByteBuffer[pos=4 lim=4 cap=16]

Code siis somting like that:
// in main method:
Service service = new Service("testtt", TransportType.SOCKET, 8888);
		registry.bind(service, new TestProvider());
		IoProtocolConnector con = new IoProtocolConnector(new SocketConnector());
		ProtocolSession sess = con.connect(new
InetSocketAddress("localhost",8888), new TestProvider());

// protocol provider
public class TestProvider implements ProtocolProvider {
	DemuxingProtocolCodecFactory factory = null;
	public ProtocolCodecFactory getCodecFactory() {
		if(factory == null) {
			factory = new DemuxingProtocolCodecFactory();
			factory.register(new TestEncoder());
			factory.register(new TestDecoder());
		return factory;
	public ProtocolHandler getHandler() {
		return new TestProtocolHandler();

public class TestMessageHandler implements MessageHandler {
	public void messageReceived(ProtocolSession arg0, Object arg1) {

public class TestEncoder implements MessageEncoder {
	HashSet types;
	public Set getMessageTypes() {
		if(types == null) {
			types = new HashSet(1);
		return types;
	public void encode(ProtocolSession arg0, Object arg1,
ProtocolEncoderOutput arg2) throws ProtocolViolationException {
		if(arg1 instanceof String) {
			try {
			} catch (UnsupportedEncodingException e) {
		}else {
			throw new ProtocolViolationException("Stringidega tegeleme");


public class TestDecoder implements MessageDecoder {
	public MessageDecoderResult decodable(ProtocolSession arg0, ByteBuffer arg1) {
		return OK;
	public MessageDecoderResult decode(ProtocolSession sess, ByteBuffer data,
			ProtocolDecoderOutput out) throws ProtocolViolationException {
		System.out.println("begin decode>"+data);
		byte[] buf = new byte[data.remaining()];
		data.get(buf, data.position(), data.remaining());
		try {
			out.write(new String(buf, "utf-8"));
		} catch (UnsupportedEncodingException e) {
		System.out.println("end decode>"+data);
		return OK;

Best regareds,
Sander Aiaots

View raw message