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

B

brieuc

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 !
 
S

SadRed

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
 
S

SadRed

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.
 
B

brieuc

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 ;)
 
G

Gordon Beaton

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
 
E

Esmond Pitt

brieuc said:
// 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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,023
Latest member
websitedesig25

Latest Threads

Top