Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / March 2007

Tip: Looking for answers? Try searching our database.

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

Thread view: 
brieuc - 20 Mar 2007 04:13 GMT
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


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.