Mina 第一个mina程序(一)

引入两个jar包 :

mina-core-2.0.3.jar

slf4j-api-1.6.0.jar

服务端编写 : Server和handler

Server:

public class MyServer {

    public static void main(String[] args) throws IOException {

        // 初始化了服务端的TCP/IP 的基于NIO 的套接字
        //IoAcceptor的抽象是IoServivce :服务端
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 调用IoSessionConfig设置读取数据的缓冲区大小
        acceptor.getSessionConfig().setReadBufferSize(2048);
        // 读写通道均在10 秒内无任何操作就进入空闲状态
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

        // 在bind前执行的准备工作
        // TextLineCodecFactory 编解码器工厂来对字符串进行编解码处理。
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
                        LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));

        acceptor.setHandler(new MyIoHandler());

        acceptor.bind(new InetSocketAddress(9123));

    }
}

handler :

public class MyIoHandler extends IoHandlerAdapter{

    // 这里我们使用的SLF4J作为日志门面,至于为什么在后面说明。
    private final static Logger log = LoggerFactory.getLogger(MyIoHandler.class);

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        String str = message.toString();
        //简单打印客户端传过来的数据
        System.out.println("The message received is [" + str + "]");
        if (str.endsWith("quit")) {
            session.close(true);
            return;
        }
    }

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("session create");
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("session closed");
    }

}

客户端编写 :client 和handler

client:

public class MyClient {

    //编写IoService并注册过滤器
    public static void main(String[] args) {

        //IoConnector的抽象是IoServivce:客户端
        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(30000);
        connector.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
                        LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));

        //为IoService注册Handler
        connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));

        connector.connect(new InetSocketAddress("localhost", 9123));

    }
}

handler:

public class ClientHandler extends IoHandlerAdapter{

    private final static Logger LOGGER = LoggerFactory.getLogger(ClientHandler.class);

    private final String values;

    public ClientHandler(String values) {
        this.values = values;
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        session.write(values);
    }

}

mina重要对象介绍 :

IoService对象

        //IoService的常用方法
        //获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。
        TransportMetadata transportMetadata = connector.getTransportMetadata();
        //增加删除一个监听器:监听IoService 的创建、活动、失效、空闲、销毁
        //参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会
        connector.addListener(null);
        connector.removeListener(null);
        //获取IoService上管理的所有IoSession,Map的key是IoSession的id
        Map<Long ,IoSession> maps = connector.getManagedSessions();
        //获取IoSession的配置对象:读数据的缓存大小,多少秒进入空闲状态
        connector.getSessionConfig();

        //1.IoAcceptor 服务端的IoService 增加bind端口方法
        //2.IoConnector 客户端的IoService 增加connect与server建立连接
        

IoSession对象

    //IoSession : 这个接口用于表示Server 端与Client 端的连接
    @Override
    public void sessionOpened(IoSession session) throws Exception {

        //这个方法用于写数据,该操作是异步的。
        session.write(values);
        //关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭。
        session.close();
        //向会话中添加一些属性,这样可以在会话过程中都可以使用,
        //类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自定义属性。
        session.setAttribute("设置属性");
        //获取远端连接的套接字地址
        session.getRemoteAddress();
        //用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同样适用。
        session.suspendWrite();
        //用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的
        //setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法,
        //因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大
        //量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于
        //Client,可能有的时候会比较便利。
//        session.read();
        //返回与当前会话对象关联的IoService 实例
        session.getService();

    }
时间: 2024-10-01 05:26:54

Mina 第一个mina程序(一)的相关文章

【Andorid开发框架学习】之Mina开发之Mina简介

今天我将介绍 Apache MINA的基本概念和 API,包括 I/O服务.I/O 会话.I/O 过滤器和 I/O 处理器. 一.MINA的简介 Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API. 二.什么是NIO? Java NIO,非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上

一个老师程序员说:这是学Java 必知必会的 20 种常用类库和 API

一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车.<Effective Java>的作者Joshua Bloch曾经说过:"建议使用现有的API来开发,而不是重复造轮子".在本文中,我将分享一些Java开发人员应该熟悉的最有用的和必要的库和API.顺便说一句,这里不包括框架,如Spring和Hibernate因为他们非常有名,都有特定的功能.最后,如果大家如果在自学遇到困难,想找一个java的学习环境,可以加入我们的java学习圈,点击我加入吧,会节约很多时

【MINA】用mina做业务服之间的通信,实现业务负载均衡思路

学习mina目的还是搭建通信架构,学完mina我们了解了如何实现客户端和服务端,也就是一个正常channel我们是知道怎么建立的 但是问题是,我们应用环境通信分为两种 1.前后端通信 其实这个比较好实现,提供一个mina server端,供前端语言通过socket建连接就行,这个通信就算是ok了,编解码等通信解析的细节这里不讲了 以前的游戏服务端架构业务多用短连接,聊天用长连接,聊天的部分其实就是上面表述的情况 现在是长连接的天下,聊天依旧是长连接,业务也做成长连接,实现了真正意义上的长连接游戏

第一个JAVA程序解析

上一篇博客中,我们编写了第一个JAVA程序并使用最原始的方式对其进行编译运行,很多文章或书籍中对该种编译运行方式不做介绍,但是我认为这有助于我们更好的了解.学习JAVA,是不可忽略的一部分,在我身边有很多人,学完一段时间JAVA后,只知道如何在IDE中进行开发,却不知脱离IDE后该如何运行,不得不说这也是一种悲哀. 言归正传,我们来看一下上一篇博客中的例子"Hello World",这也是几乎所有的编程语言都会编写的一个例子,非常的经典. 下面我们就来分析一下: /**  *  我的第

二、第一个ExtJS程序:helloExtJS

开发前的准备 下载并解压ExtJS包后,可以得到下图的文件目录结构: 在实际开发过程中并不需要所有的文件和目录,所需的包含如下目录即可: 若使用eclipse进行开发,只需将上述文件复制到WebRoot目录或其子目录. 开始 新建firstextjs.html 在使用ExtJS之前,需要在页面引入相应的样式和js文件,一般包括的最小集合是这样:ext-all.js,adapter/ext/ext-base.js,locale/ext-lang-zh_CN.js和整个resources目录. ex

当世界上只剩下一个Java程序员

公元2050年,世界上只剩下了一个Java程序员. 你可能要问了,别的人都去哪儿了?原因很简单, Java没落了. 大约在2030年左右,出现了一个叫做X的语言,它既能做系统级开发(操作系统.数据库.编译器),也能做服务器端的开发,手机端,Web端都不在话下. 更为重要的是,这个新的编程语言和人类的自然语言很接近,无论大人小孩,稍微一学,很快就可以来编程.于是排名前100的语言统统消失了, 程序员们都失业了. Java也不例外,这个昔日的霸主在留下了一堆庞大而复杂的系统以后就不见了. Java程

作为一个女程序员,有感而发

下午,在CSDN看到了一篇女程序员的迷茫的贴子,突然有感而发,写下了自己的一些感想,以及为什么我突然会来考教师资格证的奇怪想法(奇怪的想法,这是很多朋友对我的评价). 我是一个女程序员,目前是一个公司的技术架构师,写着项目核的代码,同时管理着一个不大不小的开发团队,今年一开年,大大小小6-7个新项目转到我手上,加上原有的项目维护,就能初步估计这一年又没什么假期了,还必须照顾着下面一群小伙子的心态.做项目,的确很累,特别是对于女性同胞们来讲.但是生活就是这么回事,为了不让IT狂潮把自己给淹没了,必

关于链表的一个小程序

关于链表的一个小程序: /**************************链表*****************************//* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/ #include<stdio.h>#in

使用MyEclipse开发第一个Web程序

MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导出配置,然后在MyEclipse中导入. 这里需要特别注意的是两个配置: 1.JSP的打开方式: 选为用编辑器打开: Window->Preferences->General->File Associations 然后在右边窗口选jsp,下面选择MyEclipse JSP Editor,在右