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 !
SadRed - 20 Mar 2007 06:45 GMT
> Hi everybody,
>
[quoted text clipped - 74 lines]
>
> 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 - 20 Mar 2007 06:55 GMT
> 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.
brieuc - 20 Mar 2007 07:23 GMT
> On Mar 20, 12:13 pm, "brieuc" <brieuc.go...@gmail.com> wrote:> I tried to
> > configure the channel with the blocking mode
[quoted text clipped - 3 lines]
> 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 ;)
Gordon Beaton - 20 Mar 2007 08:03 GMT
> 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();
[quoted text clipped - 4 lines]
> 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

Signature
[ 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
Esmond Pitt - 20 Mar 2007 08:25 GMT
> // 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