Blocking client and NIO server (Write back to the client issue)

Discussion in 'Java' started by brieuc, Mar 20, 2007.

  1. brieuc

    brieuc Guest

    Hi everybody,

    I have to develop a NIO server which can handle hundreds J2ME clients.
    The clients has no NIO capabilities and use blocking reading/writing
    methods.

    I have no trouble to send msg from the client to the server
    registering OP_READ :

    Client :

    OutputStream os = s.getOutputStream();
    Writer writer = new OutputStreamWriter(os, "US-ASCII");
    out = new PrintWriter(writer, true);
    out.println("msg");

    My problem is to write back data to the client from the server after
    the "msg" receiving :

    int numRead = socketChannel.read(this.readBuffer);

    if (numRead == -1) {

    sk.channel().close();

    }
    else {

    this.output = msgProcessing.process(this.readBuffer);
    Socket socketClient = socketChannel.socket();

    // Get the input/output stream.
    OutputStream os = socketClient.getOutputStream();

    Writer writer = new OutputStreamWriter(os, "US-ASCII");
    PrintWriter out = new PrintWriter(writer, true);

    out.println(this.output);
    out.close();
    }

    this.readBuffer is OK and the output is fine too. When I try to send
    the output, I get an Illegal Blocking mode exception. I tried to
    configure the channel with the blocking mode at true or false but
    apparently it doesn't matter in this case.

    At the beginning, I also tried to write back information using the
    ByteBuffer class instead of the output stream but nothing happens
    either. though I didn't have Illegal Blocking mode exception but the
    message never arrives to the client (it stays blocked on the reading
    method).

    On the client side, for reading data from the server, I did that :

    InputStream is = s.getInputStream();
    dis = new DataInputStream(is);
    ....
    // Send the data to the server. (the ouput stream stuff)
    // Wait for the output from the server.
    ....
    dis.readUTF());

    and

    InputStream is = s.getInputStream();
    in = new BufferedReader(new InputStreamReader(is));
    ....
    // Send the data to the server. (the ouput stream stuff)
    // Wait for the output from the server.
    ....
    in.readLine();

    These both techniques doesn't work for me. I'm a little stuck here so
    If you have some information, I'd really appreciate ;)

    Thank you, bye !
     
    brieuc, Mar 20, 2007
    #1
    1. Advertising

  2. brieuc

    SadRed Guest

    On Mar 20, 12:13 pm, "brieuc" <> wrote:
    > Hi everybody,
    >
    > I have to develop a NIO server which can handle hundreds J2ME clients.
    > The clients has no NIO capabilities and use blocking reading/writing
    > methods.
    >
    > I have no trouble to send msg from the client to the server
    > registering OP_READ :
    >
    > Client :
    >
    > OutputStream os = s.getOutputStream();
    > Writer writer = new OutputStreamWriter(os, "US-ASCII");
    > out = new PrintWriter(writer, true);
    > out.println("msg");
    >
    > My problem is to write back data to the client from the server after
    > the "msg" receiving :
    >
    > int numRead = socketChannel.read(this.readBuffer);
    >
    > if (numRead == -1) {
    >
    > sk.channel().close();
    >
    > }
    >
    > else {
    >
    > this.output = msgProcessing.process(this.readBuffer);
    > Socket socketClient = socketChannel.socket();
    >
    > // Get the input/output stream.
    > OutputStream os = socketClient.getOutputStream();
    >
    > Writer writer = new OutputStreamWriter(os, "US-ASCII");
    > PrintWriter out = new PrintWriter(writer, true);
    >
    > out.println(this.output);
    > out.close();
    >
    > }
    >
    > this.readBuffer is OK and the output is fine too. When I try to send
    > the output, I get an Illegal Blocking mode exception. I tried to
    > configure the channel with the blocking mode at true or false but
    > apparently it doesn't matter in this case.
    >
    > At the beginning, I also tried to write back information using the
    > ByteBuffer class instead of the output stream but nothing happens
    > either. though I didn't have Illegal Blocking mode exception but the
    > message never arrives to the client (it stays blocked on the reading
    > method).
    >
    > On the client side, for reading data from the server, I did that :
    >
    > InputStream is = s.getInputStream();
    > dis = new DataInputStream(is);
    > ...
    > // Send the data to the server. (the ouput stream stuff)
    > // Wait for the output from the server.
    > ...
    > dis.readUTF());
    >
    > and
    >
    > InputStream is = s.getInputStream();
    > in = new BufferedReader(new InputStreamReader(is));
    > ...
    > // Send the data to the server. (the ouput stream stuff)
    > // Wait for the output from the server.
    > ...
    > in.readLine();
    >
    > These both techniques doesn't work for me. I'm a little stuck here so
    > If you have some information, I'd really appreciate ;)
    >
    > Thank you, bye !


    How are your selector loop and each selection
    handler part on the server are written? That
    should be the problem on your code.

    parts on
     
    SadRed, Mar 20, 2007
    #2
    1. Advertising

  3. brieuc

    SadRed Guest

    On Mar 20, 12:13 pm, "brieuc" <> wrote:
    > I tried to
    > configure the channel with the blocking mode
    > at true or false

    If you do ordinary stream I/O with non-blocking
    mode, you typically get the IllegalBlockingMode
    exception.
     
    SadRed, Mar 20, 2007
    #3
  4. brieuc

    brieuc Guest

    On 20 mar, 13:55, "SadRed" <> wrote:
    > On Mar 20, 12:13 pm, "brieuc" <> wrote:> I tried to
    > > configure the channel with the blocking mode
    > > at true or false

    >
    > If you do ordinary stream I/O with non-blocking
    > mode, you typically get the IllegalBlockingMode
    > exception.


    Hi SadRed, thank you for your answer, I got my solution, I don't know
    if this is the good one but it works fine.

    In my server implementation, I use again the ByteBuffer instead of the
    streams (avoiding the blocking exception like you said). For the
    client,
    I use DataInputStream and the read() method and finally it works.

    I'm not very familiar with the NIO coding but I would like to know
    why neither the readUTF from DataInputStream or the readLine from
    BufferedReader
    works correctly in my case. Anyway, thank you for your help ;)
     
    brieuc, Mar 20, 2007
    #4
  5. On 19 Mar 2007 20:13:26 -0700, brieuc wrote:
    > When I try to send the output, I get an Illegal Blocking mode
    > exception. I tried to configure the channel with the blocking mode
    > at true or false but apparently it doesn't matter in this case.


    [...]

    > this.output = msgProcessing.process(this.readBuffer);
    > Socket socketClient = socketChannel.socket();
    >
    > // Get the input/output stream.
    > OutputStream os = socketClient.getOutputStream();
    >
    > Writer writer = new OutputStreamWriter(os, "US-ASCII");
    > PrintWriter out = new PrintWriter(writer, true);


    You should be using one of the socketChannel.write() methods. It
    doesn't matter that your client is not using NIO.

    /gordon

    --
    [ don't email me support questions or followups ]
    g o r d o n + n e w s @ b a l d e r 1 3 . s e
     
    Gordon Beaton, Mar 20, 2007
    #5
  6. brieuc

    Esmond Pitt Guest

    brieuc wrote:
    > // Get the input/output stream.
    > OutputStream os = socketClient.getOutputStream();


    You can't do that in non-blocking mode.

    > At the beginning, I also tried to write back information using the
    > ByteBuffer class instead of the output stream but nothing happens
    > either. though I didn't have Illegal Blocking mode exception but the
    > message never arrives to the client (it stays blocked on the reading
    > method).


    Show us your code. It should look something like this:

    int count = 0;
    try
    {
    buffer.flip();
    count = channel.write(buffer);
    }
    finally
    {
    buffer.compact();
    }
    if (count == 0)
    key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);

    etc
     
    Esmond Pitt, Mar 20, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Hendra Gunawan
    Replies:
    1
    Views:
    13,090
    Allan Herriman
    Apr 8, 2004
  2. Dave Roberts
    Replies:
    0
    Views:
    1,697
    Dave Roberts
    Jul 29, 2003
  3. xEM
    Replies:
    1
    Views:
    618
    HDSkiFreak
    May 10, 2004
  4. iksrazal

    NIO with timeouts != NIO?

    iksrazal, Jun 17, 2004, in forum: Java
    Replies:
    1
    Views:
    6,425
    iksrazal
    Jun 18, 2004
  5. Zachary  Turner
    Replies:
    12
    Views:
    546
    Arne Vajhøj
    Jul 3, 2008
Loading...

Share This Page