Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Blocking client and NIO server (Write back to the client issue)

Reply
Thread Tools

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

 
 
brieuc
Guest
Posts: n/a
 
      03-20-2007
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 !

 
Reply With Quote
 
 
 
 
SadRed
Guest
Posts: n/a
 
      03-20-2007
On Mar 20, 12:13 pm, "brieuc" <brieuc.go...@gmail.com> 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

 
Reply With Quote
 
 
 
 
SadRed
Guest
Posts: n/a
 
      03-20-2007
On Mar 20, 12:13 pm, "brieuc" <brieuc.go...@gmail.com> 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.

 
Reply With Quote
 
brieuc
Guest
Posts: n/a
 
      03-20-2007
On 20 mar, 13:55, "SadRed" <cardinal_r...@yahoo.co.jp> wrote:
> On Mar 20, 12:13 pm, "brieuc" <brieuc.go...@gmail.com> 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

 
Reply With Quote
 
Gordon Beaton
Guest
Posts: n/a
 
      03-20-2007
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
 
Reply With Quote
 
Esmond Pitt
Guest
Posts: n/a
 
      03-20-2007
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Java NIO server and Python asyncore client foobarometer@gmail.com Python 2 02-15-2013 09:41 AM
Question about non-blocking NIO and Selection Keys Zachary Turner Java 12 07-03-2008 02:01 PM
NIO with timeouts != NIO? iksrazal Java 1 06-18-2004 02:28 PM
[java.nio] Blocking mode for a while - How ? xEM Java 1 05-10-2004 06:30 PM
NIO SelectionKey.interestOps() blocking Dave Roberts Java 0 07-29-2003 07:54 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57