`
ginge
  • 浏览: 208619 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一般Socket客户端与Mina NIO Socket客户端对比示例

    博客分类:
  • JBPM
阅读更多

  在看Mina源代码时发现其客户端Socket Connector的例子很少,耗费了我一些时间。相对传统IO的堵塞式,NIO 的优势和特色就在于非堵塞了。使用NIO的话,不管是服务器端还是客户端,都不用堵住了。这样就大大提高了服务处理的能力,也减少了等待的时间。当然,传统IO Socket编程通常都会使用一个专有线程监听连接请求,获悉新请求后产生其它线程来服务该连接。不管怎么样,这些服务都是同步操作。NIO就不一样了,什么都是通知的。打个比方,就像一个客人到商店预订商品,当商品齐全了,店长就可以将商品发送给客人,或者通知客人取货了。

 

  由于采取了NIO,所以使用Mina时一定要有异步消息处理思想。这里提供一个简单的例子服务器端用传统IO ServerSocket,收到新请求后只是返回一个消息:

 

try {

                Socket socket = this.serverSocket.accept();

                InputStream is = socket.getInputStream();

                DataInputStream dis = new DataInputStream(is);


                if(dis.read(bytes) < 1024)

                {

                    System.out.println(new String(bytes));

                }            

                OutputStream os = socket.getOutputStream();

                os.write(("This is server, your reservation number:["+i+"]").getBytes());

                os.write(("\nAnything i can help?").getBytes());

                os.flush();

                os.close();

                is.close();

                socket.close();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

 

 

 

 

 

 

传统Socket客户端实现:

public void request(byte [] reequest, ResponseHandler handler)

    {

        if(!socket.isConnected()){

            throw new IllegalStateException("Socket not connected to["+address+":"+port+"].");

        }

        OutputStream os = null;

        InputStream is = null;

        DataInputStream dis = null;

        try {        

            os = this.socket.getOutputStream();

            os.write(reequest);

            os.flush();    

            is = this.socket.getInputStream();

            dis = new DataInputStream(is);         

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte [] bytes = new byte[1024];

            int len = 0;

            while((len = dis.read(bytes)) != -1)

            {

                baos.write(bytes, 0, len);

            }          

            handler.handleResponse(baos.toByteArray());

        } catch (IOException e) {

        }finally

        {

            try {

                dis.close();

            } catch (IOException e) {
 
            }

            try {

                os.close();

            } catch (IOException e) {


            }       

            try {

                this.socket.close();

            } catch (IOException e) {

            }

        }

    }

 

 

MinaSocket Connector方式:

public void test1()

    {

        try {

            final StringBuffer buf = new StringBuffer();

            SocketConnector connector = new SocketConnector();

            ConnectFuture future = connector.connect(new InetSocketAddress(

                    "localhost", 9999), new IoHandlerAdapter() {

                public void sessionCreated(IoSession session) {

                    log.debug("Session Created");

                    buf.append("1");

                }


                public void sessionOpened(IoSession session) {

                    log.debug("Session Opened");
 

                    WriteFuture writeFuture = session.write(ByteBuffer.wrap("Hello".getBytes()));

                    writeFuture.join();

                }

                public void exceptionCaught(IoSession session, Throwable cause) {

                    log.debug("Exception,", cause);

                    buf.append("X");

                }

                @Override

                public void messageReceived(IoSession session, Object message)

                        throws Exception {
         

                    if(message instanceof ByteBuffer)

                    {                       

                        ByteBuffer byteb = (ByteBuffer)message;

                        ByteArrayOutputStream baos = new ByteArrayOutputStream();


                        byte[] bytearray = new byte[1024];

                        while(byteb.hasRemaining())

                        {

                            int len = Math.min(byteb.remaining(), 1024);

                            byteb.get(bytearray,0, len);

                            baos.write(bytearray, 0, len);

                        }

                        log.debug("Message from Server:" + new String(baos.toByteArray()));

                    }                   

                }


                @Override

                public void messageSent(IoSession session, Object message)

                        throws Exception {

                    log.debug("Sent:" + message);

                }


                @Override

                public void sessionClosed(IoSession session) throws Exception {

                    log.debug("Session closed.");

                    super.sessionClosed(session);

                }


                @Override

                public void sessionIdle(IoSession session, IdleStatus status)

                        throws Exception {

                    // TODO Auto-generated method stub

                    super.sessionIdle(session, status);

                }

            });

            log.debug("connect future join begin.");
//等待连接准备
            future.join();

            log.debug("connect future join end.");     

            CloseFuture closeFuture = future.getSession().close();

            log.debug("close future join begin.");

            closeFuture.join();

            log.debug("close future join end.");
        }catch(Exception e)

        {
            e.printStackTrace();
        }

    }

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics