`
ginge
  • 浏览: 211944 次
  • 性别: 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
分享到:
评论

相关推荐

    Mina NIO Socket

    《Mina NIO Socket:深度解析与应用》 在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket...

    mina框架中socket使用,有服务端和客户端。

    mina框架是Apache组织开发的一个网络通信框架,...通过这个项目,开发者不仅可以学习到MINA框架的基础使用,还能了解网络编程中的服务端与客户端交互原理,以及如何利用MINA提供的工具来构建高效、稳定的网络应用程序。

    Mina+Socket通信

    本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic Application Networking API”)是Apache软件基金会的一个开源项目,它为开发者提供了一...

    socket通信,mina长连接通信

    Socket通信和MINA长连接是网络编程中的两个关键概念,主要应用于服务器与客户端之间的数据交互。在移动应用开发,特别是需要实时推送功能时,这两种技术显得尤为重要。 **Socket通信** Socket,也称为套接字,是...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    同时,“Netty快速入门视频(52im.net).txt”虽然不是直接与Mina相关的,但Netty也是基于NIO的高性能网络库,学习它的资料也能加深对NIO的理解。最后,“MinaDemo”可能是Mina框架的一个示例项目,你可以通过运行和...

    socket mina测试框架

    Socket Mina测试框架是一个强大的网络通信应用框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能的I/O处理模型,使得开发者能够更专注于业务逻辑,而不是底层的网络实现细节。Mina...

    apache mina socket实例

    mina简单示例,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...

    niosocket及其开源框架MINA学习总结收集.pdf

    NIO (Non-blocking Input/Output) 是Java中的一种I/O模型,与传统的 blocking I/O 相比,它提供了更高效的数据处理方式。在传统的Socket编程中,每个连接都会创建一个新的线程进行处理,这在连接数量较少时是可行的...

    Android Java Socket框架 Mina2.0

    在Mina2.0的示例代码中,客户端和服务器端通常包括以下步骤: 1. **配置服务端**:创建Acceptor,设置监听端口,添加必要的过滤器和处理器。 2. **启动服务端**:启动Acceptor,开始监听客户端连接。 3. **配置...

    原创nio socket mina+javascript+flash实现commet长连接网页聊天室

    【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...

    java socket nio 研究

    Java Socket和NIO(非阻塞I/O)是Java编程中的重要部分,它们在构建高性能、高并发的网络应用程序中发挥着关键作用。Socket是基于TCP/IP协议的应用层接口,而NIO则是一种I/O模型,它提供了不同于传统阻塞I/O的处理...

    基于MINA构建简单高性能的NIO应用

    通过示例中的时间服务器程序,我们可以了解到MINA如何抽象出事件模型来处理网络事件,实现客户端与服务端之间的通信,以及如何通过过滤器链来增强和扩展程序的功能。对于希望实现高性能网络应用的开发者而言,MINA...

    Mina通信框架应用示例

    - NIO框架库:MINA利用Java的非阻塞I/O模型,提供高效的数据传输能力。 - 客户端-服务器框架库:MINA支持多种通信协议,可以构建客户端和服务器端应用。 - 网络socket库:MINA提供了一套完整的网络通信接口,方便...

    mina框架中socket应用的简单小项目,包含了所需jar

    描述进一步确认了这个项目是关于MINA框架与Socket应用的,意味着它可能包含了一个简单的服务器和客户端示例,用来展示如何在MINA中创建和管理Socket连接。"包含了所需jar"这部分意味着所有必要的依赖都已经包含在内...

    mina及时推送客户端服务端实现

    5. **Android-tcp-long-connection-based-on-Apache-mina-master**:这个项目名表明它是一个基于Apache MINA实现的Android客户端与服务器之间的TCP长连接示例。在Android环境中,由于系统可能因内存管理等原因关闭...

    MINA2 教程 socket

    在这个"MINA2 教程 socket"中,我们将探讨如何使用MINA2来实现服务器与客户端之间的通信,并且支持同时在线连接,以及如何利用`newFixedThreadPool`线程池来优化处理并发连接。 1. **MINA2基本概念**: MINA2的...

    mina2.x开发示例

    6. **配置与启动**:在Mina应用中,通常需要配置ServerBootstrap或ClientBootstrap,设定Socket选项,如接收缓冲区大小,以及添加过滤器和处理器。然后通过start()方法启动服务。 7. **异常处理**:在网络通信中,...

Global site tag (gtag.js) - Google Analytics