directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Luca Zago <luca.z...@gmail.com>
Subject Re: [mina] Suggestions for a proxy server
Date Sun, 24 Apr 2005 21:42:18 GMT
Thanks for the Fix.
I am conitnuing my testing, yes for this small char server. But I am
facing some problems with the solution of sending the message to all
opened sessions..
my dataRead method looks like:

public void dataRead( IoSession session, ByteBuffer rb ) {
        System.out.println( Thread.currentThread().getName() + ' '
                + session.getRemoteAddress() + ": READ: " + rb.toString());
        ByteBuffer wb = ByteBuffer.allocate( rb.remaining() );
        wb.put( rb );
        wb.flip();
        for (int i = 0 ; i < sessions.size(); i ++) {
            IoSession sessionTemp = (IoSession)sessions.get(i);
            sessionTemp.write(wb,null);
        }
    }
but after the second sending I get an exception:
java.lang.IllegalStateException: Already released buffer.  You
released the buffer too many times.
    at org.apache.mina.common.ByteBuffer$DefaultByteBuffer.release(ByteBuffer.java:557)
    at org.apache.mina.io.socket.SocketIoProcessor.flush(SocketIoProcessor.java:431)
    at org.apache.mina.io.socket.SocketIoProcessor.flushSessions(SocketIoProcessor.java:392)

I read the code of ByteBuffer.. it seems that the buffer has been
never released so the counter refCount is never decreased. Even if I
don't understand the meaning of that counter.

Thanks, and congratulations for the great work.
Luca

P.S: I am reading all the code, if I can get some ideas I will let you know

On 4/24/05, Trustin Lee <trustin@gmail.com> wrote:
> Hi,
> 
> Thank you for the client-side code.  I reproduced the problem, and
> fixed it.  SocketIoProcessor didn't fire the last dataRead event when
> connection is closed by a client.  I confirmed your code is working
> fine now.
> 
> Thank you again for reporting a bug!
> Trustin
> 
> 2005/4/25, Luca Zago <luca.zago@gmail.com>:
> > Hi,
> > I did some more deep tests.
> > The server is very simple, I created a server only to receive messages.
> > So the start up code is...
> > IoThreadPoolFilter ioThreadPoolFilter = new IoThreadPoolFilter();
> >         // and start both.
> >         ioThreadPoolFilter.start();
> >         // Create a TCP/IP acceptor.
> >         IoAcceptor acceptor = new SocketAcceptor();
> >         // Add both thread pool filters.
> >         acceptor.getFilterChain().addFirst("threadPool", ioThreadPoolFilter );
> >          // Bind
> >          acceptor.bind( new InetSocketAddress( PORT ), new
> > SocketProtocolHandler() );
> >          System.out.println( "Listening on port " + PORT );
> >
> > the SocketProtocolHandler is very simple system.out in every method.
> > The client is attached to this email..  it's open a connections end a
> > message anc close.
> > What I can see from log is..the OPEN session, the Close session..in
> > the most of cases.
> > In some occasion rarely I see the received message.
> > I tried not to use IoThreadPoolFilter, but the result is the same.
> > I tried the same client with a very similar server in Netty2. And it
> > works fine, it receives all the messages, I am agree with you it can
> > be a thread issue inside Mina.
> > have you any suggestions?
> >
> > Thanks a lot in advance,
> > Luca
> >
> > On 4/24/05, Trustin Lee <trustin@gmail.com> wrote:
> > > Hi,
> > >
> > > 2005/4/24, Luca Zago <luca.zago@gmail.com>:
> > > > Hi Guys,
> > > > to understand how mina works, I am building a small proxy server, the
> > > > functionality is quite easy, a client connect and send a message, the
> > > > server broadcasts the message to all connected clients. I am facing
> > > > two main problems:
> > >
> > > It's a kind of chatroom server, right?
> > >
> > > > 1) I don't understand if in mina there is a class which keeps all the
> > > > opened session by an acceptor. And where I can manage the writing of
> > > > the message in all the sessions opened?
> > > > I was trying to keep the opened session in a vector inside my
> > > > IoHandler class  and writing back the message in dataRead method to
> > > > each session in the vector. But it doesn't seem a thread safe way of
> > > > managing it.
> > >
> > > There's no such class for now.  I think you're doing right.  I would
> > > use Cursorable LinkedList from Jakarta Commons Collections which is
> > > better when you iterate the list.
> > >
> > > > 2) I  have a simple client to send a message, it looks client:
> > > > wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
> > > > wr.write("aString\n");
> > > > wr.flush();
> > > > wr.close();
> > > > I run it many times..and on my server randomly I see my daRead method
> > > > called, in the most of the times I see an opened and then immediately
> > > > closed session. It seems it's too fast and the server looses the
> > > > dataRead event. The server is built like the EchoServer in the
> > > > example, with SocketAcceptor and IoThreadPoolFilter. Is it a problem
> > > > of some configuration parameters?
> > >
> > > Did you log any messages when server receives any data so that we can
> > > confirm any data is lost?  If you didn't and just replied the data
> > > back to client silently, The connection might be closed already when
> > > you reply to client due to the sideeffect of thread pool.  Otherwise,
> > > I'll test by myself, and try to reproduce this issue.  Of course any
> > > test case code is appreciated.
> > >
> > > Thanks,
> > > Trustin
> > > --
> > > what we call human nature is actually human habit
> > > --
> > > http://gleamynode.net/
> > >
> >
> >
> >
> --
> what we call human nature is actually human habit
> --
> http://gleamynode.net/
>

Mime
View raw message