users@grizzly.java.net

Re: TCPConnectorHandler doesn't block ?

From: Jeanfrancois Arcand <Jeanfrancois.Arcand_at_Sun.COM>
Date: Mon, 24 Nov 2008 11:10:51 -0500

Salut,

Survivant 00 wrote:
> I have a question. I,m using the demo client TCP found on the main page
> of grizzly.. (one of them :))
>
> I just moved some code into methods.
>
> My problem is I was excepted that the read block until a value >-1 was
> returned. ( Even check into NonBlockingTCPIOClient and the function
> receive contains :
> public int receive(byte[] buf, int length) throws IOException {
> ByteBuffer byteBuffer = ByteBuffer.wrap(buf,0,length);
> long bytesRead = tcpConnectorHandler.read(byteBuffer,true);

I think we need to improve the document. calling read(bb, true) just
means you are guarantee that the read will return bytes, or -1 if the
client close the connection.

Are you saying it never blocks (return 0)?

A+

-- Jeanfrancois


>
> if (bytesRead == -1) {
> throw new EOFException("Unexpected client EOF!");
> }
>
> return (int) bytesRead;
> }
>
>
> ----------------------
>
>
> What I'm missing ?
>
>
>
> public class TCPClientTest {
>
> private String host = "localhost";
> private int port = 7803;
>
> private TCPConnectorHandler connector_handler;
> private Controller controller;
> private TCPSelectorHandler tcp_selector_handler;
>
> private ByteBuffer buf = ByteBufferFactory.allocateView(1000, false);
> private ByteBuffer response = ByteBufferFactory.allocateView(1000,
> false);
>
> public void init() {
> final CountDownLatch started = new CountDownLatch(1);
>
> controller = new Controller();
> tcp_selector_handler = new TCPSelectorHandler(true);
> controller.addSelectorHandler(tcp_selector_handler);
>
> controller.addStateListener(new ControllerStateListenerAdapter() {
>
> public void onException(Throwable e) {
> System.out.println("Grizzly controller exception:" +
> e.getMessage());
> }
>
> public void onReady() {
> System.out.println("Ready!");
> started.countDown();
> }
>
> });
>
> new Thread(controller).start();
> try {
> started.await();
> } catch (Exception e) {
> System.out.println("Timeout in wait" + e.getMessage());
> }
>
> connector_handler = (TCPConnectorHandler)
> controller.acquireConnectorHandler(Controller.Protocol.TCP);
> }
>
> public void connect(){
> try {
> connector_handler.connect(new InetSocketAddress(host, port),
> new CallbackHandler<Context>() {
> public void onConnect(IOEvent<Context> e) {
> SelectionKey k = e.attachment().getSelectionKey();
> System.out.println("Callbackhandler: OnConnect...");
> try {
> connector_handler.finishConnect(k);
> } catch (Exception ex) {
> System.out.println("exception in
> CallbackHandler:" + ex.getMessage());
> }
> e.attachment().getSelectorHandler().register(k,
> SelectionKey.OP_READ);
> }
>
> public void onRead(IOEvent<Context> e) {
> }
>
> public void onWrite(IOEvent<Context> e) {
> }
>
> });
>
> } catch (Exception e) {
> System.out.println("Exception in execute..." + e);
> e.printStackTrace(System.out);
> }
> }
>
> public void send(String quote) throws Exception {
> byte[] msg = quote.getBytes();
>
> buf = ByteBufferFactory.allocateView(msg.length, false);
>
> buf.put(msg);
> buf.flip();
> connector_handler.write(buf, true);
> buf.clear();
> long count = connector_handler.read(response, true);
>
> if(count>-1){
> byte[] b = new byte[(int)count];
> response.get(b);
>
> System.out.println(new String(b));
> buf.rewind();
> } else {
> System.out.println("count==-1");
> }
>
> }
>
> public void close(){
> try {
> if(connector_handler!=null){
> connector_handler.close();
> }
> if(controller!=null){
> controller.stop();
> }
> } catch (IOException e) {
> e.printStackTrace();
> }
> }
>
> public static void main(String[] args) {
> TCPClientTest client = new TCPClientTest();
>
> try {
> client.init();
> client.connect();
>
> client.send("quote|aaa[eoq]");
> client.send("quote|bbb[eoq]");
> client.send("quote|ccc[eoq]");
>
> client.close();
> } catch(Exception e){
> e.printStackTrace();
> } finally {
> try {client.close();}catch(Exception e){}
> }
>
> }
>
> the output is :
>
> Ready!
> Callbackhandler: OnConnect...
> BID AAA = 1.123
> count==-1
> BID CCC = 2.00
>