`
zzc1684
  • 浏览: 1231010 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

nio/mina(三) mina传对象

    博客分类:
  • Mina
阅读更多

 

参考文章:http://blog.chinabyte.com/a/534099.html

传递对象的原因:个人理解:符合面向对象,服务器接收客户端消息,需要解析,处理,应答,如果传的是对象,可以把解析,处理,应答写在对象里,这么做,扩展性更好.

 

客户端

1 MinaClient.java

    package com.nafio.client;  
      
    import java.net.InetSocketAddress;  
    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
    import org.apache.mina.core.future.ConnectFuture;  
    import org.apache.mina.filter.codec.ProtocolCodecFilter;  
    import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
    import org.apache.mina.transport.socket.nio.NioSocketConnector;  
      
    /** 
     * @author nafio 2012-08-20 
     * mina传递对象客户端 
     */  
    public class MinaClient {          
        //使用单例模式  
        private static MinaClient minaClient = null;  
        //创建 TCP/IP connector  
        NioSocketConnector connector = new NioSocketConnector();  
        //创建接收数据的过滤器  
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
          
        //使用单例  
        //相关的IoHandlerAdapter继承类都采用了单实例模式  
        //在整个通信过程中做到对象session等实例的单一防止发生“所托非人”的现象//这个不是很理解?  
        public static MinaClient getInstances() {      
            if (null == minaClient) {                  
                minaClient = new MinaClient();      
            }              
            return minaClient;      
        }          
        private MinaClient() {  
            //设定这个过滤器将按对象读取数据  
            chain.addLast("myChin", new ProtocolCodecFilter(      
                    new ObjectSerializationCodecFactory()));             
            connector.setHandler(ClientHandler.getInstances(connector));//by nafio用于彻底关闭客户端连接  
            //设定连接超时  
            connector.setConnectTimeout(30);  
            //连接服务器  
            ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",      
                8888));          
              
        }      
        public static void main(String args[]) {      
            MinaClient.getInstances();          
        }      
    }    

 

2 ClientHandler.java

    package com.nafio.client;  
      
    import org.apache.mina.core.service.IoHandlerAdapter;  
    import org.apache.mina.core.session.IdleStatus;  
    import org.apache.mina.core.session.IoSession;  
    import org.apache.mina.transport.socket.nio.NioSocketConnector;  
      
    import com.nafio.obj.TransferObj;  
      
    /** 
     * @author nafio 2012-08-20 
     * mina传递对象客户端 
     */  
    public class ClientHandler extends IoHandlerAdapter {      
        private static ClientHandler minaClientHandler = null;  
      
        NioSocketConnector connector;//by nafio用于彻底关闭客户端连接  
        public static ClientHandler getInstances(NioSocketConnector con) {      
            if (null == minaClientHandler) {  
                minaClientHandler = new ClientHandler(con);  
            }  
            return minaClientHandler;  
        }          
        private ClientHandler(NioSocketConnector con) {  
            connector=con;  
        }          
      
        public void sessionOpened(IoSession session) throws Exception {  
            //session.write("来自客户端:与服务端会话打开");      
              
            System.out.println("客户端:打开了与服务端的会话");  
            sendMsg(session);  
        }  
      
        //会话结束后触发  
        public void sessionClosed(IoSession session) {  
            System.out.println("客户端:与服务端会话结束");  
        }  
        //接到返回信息后触发  
        public void messageReceived(IoSession session, Object message)throws Exception {  
            System.out.println("客户端:接收到服务端返回信息");  
        }  
      
        //连接创建时触发  
        public void sessionCreated(IoSession session) throws Exception {  
            super.sessionCreated(session);  
            System.out.println("客户端:与服务端连接创建");  
        }  
        //连接空闲是触发  
        public void sessionIdle(IoSession session, IdleStatus status)  
        throws Exception {  
            super.sessionIdle(session, status);  
            System.out.println("客户端:连接空闲");  
        }  
        //发送信息后触发  
        public void messageSent(IoSession arg0, Object arg1) throws Exception {  
            //System.out.println("客户端:已向服务器发送-->"+(String)arg1);  
            System.out.println("客户端:发送对象完毕");  
            arg0.close();//这里实际不能彻底关闭mina2.0需要connector.dispose()才能彻底关闭     
            connector.dispose();//不需要关闭去掉这两句就ok  
            System.out.println("客户端:强行关闭连接");  
        }     
      
        /** 
         * 传送信息 
         * @param session 
         * @throws Exception 
         */  
        public void sendMsg(IoSession session) throws Exception{  
            TransferObj transferObj=new TransferObj();  
            transferObj.setDate("nafio_date");  
            session.write(transferObj);  
        }  
      
        public void exceptionCaught(IoSession session, Throwable cause)  
        throws Exception {  
            super.exceptionCaught(session, cause);  
        }  
    }      

 

3 TransferObj.java

    package com.nafio.obj;  
      
    public class TransferObj implements java.io.Serializable{  
        private String date;      
            
        public String getDate() {      
            return date;         
        }      
        public void setDate(String date) {   
            this.date = date;      
        }          
                    
    }      

 

服务端

1 MinaServer.java

    package com.nafio.server;  
      
    import java.io.IOException;  
    import java.net.InetSocketAddress;  
      
    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
    import org.apache.mina.filter.codec.ProtocolCodecFilter;  
    import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
    import org.apache.mina.transport.socket.SocketAcceptor;  
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
      
    public class MinaServer {      
        private static MinaServer minaServer = null;  
        //创建一个非阻塞的Server端Socket  
        private SocketAcceptor acceptor = new NioSocketAcceptor();  
        //创建接收数据的过滤器  
        private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();          
        private int bindPort = 8888;  
          
        //单例  
        public static MinaServer getInstances() {      
            if (null == minaServer) {                 
                minaServer = new MinaServer();      
            }              
            return minaServer;      
        }          
        private MinaServer() {              
            //设定这个过滤器将按对象读取数据  
            chain.addLast("myChin", new ProtocolCodecFilter(      
                    new ObjectSerializationCodecFactory()));   
            //设定服务器端的消息处理器:一个MinaServerHandler对象,  
            acceptor.setHandler(ServerHandler.getInstances());     
              
            try {  
                //绑定端口,启动服务器  
                acceptor.bind(new InetSocketAddress(bindPort));  
                  
            } catch (IOException e) {                  
                e.printStackTrace();      
            }   
            System.out.println("服务端:监听端口--->" + bindPort);  
        }      
        public static void main(String[] args) throws Exception {      
            MinaServer.getInstances();          
        }      
    }      

 

2  ServerHandler.java

    package com.nafio.server;  
      
    import org.apache.mina.core.filterchain.IoFilterAdapter;  
    import org.apache.mina.core.service.IoHandler;  
    import org.apache.mina.core.service.IoHandlerAdapter;  
    import org.apache.mina.core.session.IdleStatus;  
    import org.apache.mina.core.session.IoSession;  
      
    import com.nafio.obj.TransferObj;  
    //下面两种写法应该等同,不确定?  
    //public class ServerHandler extends IoHandlerAdapter {    
    public class ServerHandler extends IoFilterAdapter implements IoHandler {      
        private static ServerHandler samplMinaServerHandler = null;          
        public static ServerHandler getInstances() {  
            if (null == samplMinaServerHandler) {      
                samplMinaServerHandler = new ServerHandler();  
            }      
            return samplMinaServerHandler;          
        }      
        private ServerHandler() {      
        }      
        public void sessionOpened(IoSession session) throws Exception {  
      
        }      
        public void sessionClosed(IoSession session) {  
      
        }      
        public void messageReceived(IoSession session, Object message)throws Exception {        
            if (message instanceof TransferObj) {  
                TransferObj obj = (TransferObj) message;      
                System.out.println("服务端:收到客户端数据--->"+obj.getDate());   
            }           
        }      
        public void exceptionCaught(IoSession arg0, Throwable arg1)throws Exception {          
        }          
        public void messageSent(IoSession arg0, Object arg1) throws Exception {      
              
        }      
        public void sessionCreated(IoSession arg0) throws Exception {  
              
        }          
        public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {   
              
        }      
    }    

 

3 TransferObj.java(跟客户端相同,因为客户端和服务端要分开,所以这个类两个工程中都放一个)

 

 

彻底关闭mina客户端连接的方法

session.close();

java默认不赞成使用这个方法

这个方法使用后客户端实际还没彻底关闭

mina2.0彻底关闭用connector.dispose();  

 

关于socket长短连接

通常的短连接操作步骤是:
连接→数据传输→关闭连接;
长连接通常就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了

所以mina默认应该就是长连接所以默认不关闭.

分享到:
评论

相关推荐

    网络编程(socket、NIO、mina)---demo

    在这个"网络编程(socket、NIO、mina)---demo"的主题中,我们将深入探讨三个关键概念:Socket编程、非阻塞I/O(Non-blocking I/O,简称NIO)以及Apache Mina框架。这些技术广泛应用于构建高性能、高并发的网络应用...

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

    Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...

    nio.rar_NIO_java nio_java_nio_mina java n

    NIO在Java 1.4版本中引入,其核心是Channel、Buffer和Selector三大组件。下面将详细介绍这三个主要概念以及NIO在实际开发中的应用。 1. **Channel(通道)**:Channel类似于传统I/O中的流,但有显著的不同。在NIO中...

    NIO_MINA学习例子_源代码

    NIO (Non-blocking Input/Output) 和 MINA (Multipurpose Infrastructure for Network Applications) 是Java中用于高性能网络应用的两个重要框架。NIO是Java标准库的一部分,提供了与传统IO(Blocking I/O)不同的I/...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    Java_nio&mina技术调研报告

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、易用的网络应用程序框架,基于Java NIO构建。MINA为开发者提供了高度抽象的API,简化了网络编程的复杂性。MINA支持TCP和UDP协议,适用...

    Mina NIO Socket

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

    apache-mina-2.0.4架包及源码各pdf学习教程

    当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。不管是新手还是老手,还是很有学习参考价值的。

    基于高性能NIO的MINA框架的应用

    MINA框架(Multipurpose Infrastructure for Network Applications)是基于Java NIO设计的网络应用程序框架,其特点是采用松耦合架构,支持灵活的过滤器机制,同时单元测试也更为容易实现。MINA允许自定义线程数量,...

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

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

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

    本文将通过一个对比实例,探讨一般Socket客户端与Mina NIO (Non-blocking I/O) Socket客户端的差异和特点,帮助开发者理解这两种技术在实际应用中的选择。 首先,普通Socket客户端基于BIO(Blocking I/O)模型,它...

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

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

    练练手,用mina2.0搭建一个nio客户端

    标题中的“练练手,用mina2.0搭建一个nio客户端”表明了本文将探讨如何使用Mina 2.0框架构建一个基于非阻塞I/O(NIO)的客户端应用。Mina是一个开源的Java框架,常用于开发高性能、高并发的网络通信应用,如TCP/IP和...

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    1. 优化的内存管理:Mina ByteBuffer可能使用更高效的内存分配策略,例如直接内存分配,避免了Java对象在堆上的创建和垃圾收集开销。 2. 基于池化的管理:Mina通过缓冲区池来复用ByteBuffer实例,减少频繁的创建和...

    mina开发示例

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

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

    ### 基于MINA构建高性能的NIO应用 #### 概述 MINA作为一款优秀的客户端/服务器架构下的Java服务器框架,凭借其强大的功能和灵活性,在开发高性能网络应用程序方面表现突出。本文将深入探讨MINA的核心概念、优势...

    springboot 整合mina 源码,nio通讯基础教程,mina框架基础教程.rar

    在本教程中,我们将深入探讨如何整合Spring Boot与Mina框架,同时介绍Java NIO(非阻塞I/O)的基础知识。Spring Boot以其简洁、快速的起步方式深受开发者喜爱,而Mina则是一个强大的网络通信框架,常用于构建高性能...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    通过使用I/O多路复用技术,如NIO(非阻塞I/O),Mina能够高效地管理多个连接,而无需为每个连接创建单独的线程。这极大地降低了系统资源的消耗,提高了服务器的并发能力。 2. **Mina文件图片传送** 在Mina中,我们...

    mina框架--MINA框架是对java的NIO包的一个封装

    MINA框架通过封装NIO,提供了一种更加面向对象和易于使用的API,使得开发者可以更方便地创建高性能、可扩展的网络应用,如TCP和UDP服务器。 在上述代码中,可以看到如何使用MINA框架初始化一个服务器: 1. `...

Global site tag (gtag.js) - Google Analytics