Mina使用总结(三)MinaClient

简单的Mina客户端代码MinaSimpleClient.java:

package com.bypay.mina.client;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import com.bypay.mina.handler.ClientTimerHandler;

/**
 * Mina客户端
 * @author 唐延波
 * @date 2015-1-20
 *
 */
public class MinaSimpleClient {

    private static String HOSTNAME = "localhost";

    private static int PORT = 9123;

    /**
     * @author 唐延波
     * @throws InterruptedException
     * @date 2014-11-4
     */
    public static void main(String[] args) throws InterruptedException {
        NioSocketConnector connector = new NioSocketConnector();
        //设置编码解码器
        connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                .forName("UTF-8"))));

        //设置Handler
        connector.setHandler(new ClientTimerHandler());

        //获取连接,该方法为异步执行
        ConnectFuture future = connector.connect(new InetSocketAddress(
                HOSTNAME, PORT));

        //等待连接建立
        future.awaitUninterruptibly();

        //获取session
        IoSession session = future.getSession();

        //等待session关闭
        session.getCloseFuture().awaitUninterruptibly();

        //释放connector资源
        //实际开发中,不要频繁关闭connector,因为它是重量级资源,应该设计成单例或者连接池
        connector.dispose();

    }
}

处理消息发送和消息接收

ClientTimerHandler.java代码:

package com.bypay.mina.handler;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * ClientHandler
 *
 * @author 唐延波
 * @date 2015-1-20
 *
 */
public class ClientTimerHandler extends IoHandlerAdapter {

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        // session 创建时调用
        session.write("test");
    }

    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        // 异步接收消息
        String str = message.toString();
        System.out.println("接收服务端消息:" + str);
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        // 出现异常
        cause.printStackTrace();
        session.close(true);
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        // 心跳
        System.out.println("客户端ide:");
    }
}
时间: 2024-10-26 10:20:24

Mina使用总结(三)MinaClient的相关文章

dubbo学习 一 dubbo概述

1,背景 1,网站刚开时候的时候可能所有的功能业务都在一个应用里面 2,当业务不断复杂,流量不断增多的时候,就需要将原先的一个应用划分成多个独立的应用. 3,当分出来的业务越来越多的时候,应用也变的多而复杂,各个应用之间的交互也必不可少,就需要进行远程服务调用RPC,使用哪个找哪个,调用哪个. 4,当服务越来越多的时候,上面那种用一个找一个的方法,不仅管理混乱而且资源浪费,这时就需要一个服务调度中心来管理所有的服务信息,做为一个服务中心,所有使用者都只要关注服务中心即可.并且还需要不同服务 不同

Mina airQQ聊天 客户端篇(三)

开发工具 (FlashBuilder4.7) 程序类型(Adobe Air) Flex Air做的桌面程序,效果还挺好看的,最主要是Socket这一块,它也是异步的,并且在Flex中的事件机制比较强大(个人认为) 有改一些样式,重新看看新的效果吧: 大致的实现方式: 在WindowedApplication中包含登陆窗口和主界面,用Flex中的状态来切换,聊天窗口时Window组件,好友列表用树菜单 实现好友分组,好友上线时改成在线图标,收到消息时头像抖动,聊天显示实现图文混排,系统托盘,其它貌

NIO框架之MINA源码解析(三):底层通信与责任链模式应用

本文主要介绍下在mina中责任链模式的应用以及mina对于数据读写的处理. 在mina中,对数据的读操作是在processor类里面触发的,收到新消息后就触发读数据链去处理新消息直到自己的业务逻辑代码(IoHandler). 在mina中,数据的写(write)和发(send)差别相对较大,mina中的写消息最终的结果只是把要写的消息经过写数据链处理后的最终结果放在了一个缓存中,并把当前session标记为可发. 数据的发送就是传统中我们所说的发消息,就是把写消息最终处理的结果发送到客户端,待发

Mina、Netty、Twisted一起学习(三):TCP前缀固定大小的消息(Header)

于以前的博文于,有介绍切割消息换行的方法. 但是有一个小问题,这样的方法,设消息中本身就包括换行符,那将会将这条消息切割成两条.结果就不正确了. 本文介绍第二种消息切割方式,即上一篇博文中讲的第2条:use a fixed length header that indicates the length of the body.用一个固定字节数的Header前缀来指定Body的字节数,以此来切割消息. 上面图中Header固定为4字节,Header中保存的是一个4字节(32位)的整数,比如12即为

(三)Mina源码解析之IoFilter

本篇文章主要剖析Mina中的过滤器是如何实现的 首先还是引入一个简单的完整的server端的例子,代码如下 public class Server { public static void main(String[] args) { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setId

Mina、Netty、Twisted一起学(三):TCP消息固定大小的前缀(Header)

在上一篇博文中,有介绍到用换行符分割消息的方法.但是这种方法有个小问题,如果消息中本身就包含换行符,那将会将这条消息分割成两条,结果就不对了. 本文介绍另外一种消息分割方式,即上一篇博文中讲的第2条:use a fixed length header that indicates the length of the body,用一个固定字节数的Header前缀来指定Body的字节数,以此来分割消息. 上面图中Header固定为4字节,Header中保存的是一个4字节(32位)的整数,例如12即为

Mina学习

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.Apache MINA 2 可以作为开发网络应用程序的一个良好基础 优点: – 异步 – 无阻塞 – 事件驱动 – 支持TCP, UDP, APR, 串口… – 通过 过滤器(Filters)实现扩展性 – 同时提供协议框架   Server端应用 对socket通信来说,使用比较广泛的是基于Serv

JAVA通信系列二:mina入门总结

一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http://www.cnblogs.com/juepei/p/3940396.html Apache Mina 入门实例--创建一个MINA时间服务http://loftor.com/archives/apache-mina-quick-start-guide.html MINA2.0用户手册中文版--系列文

Mina airQQ聊天 服务端篇(二)

Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求好友列表:若不成功,则断开连接. 自己定义协议格式:包头+包体 包头(10字节):包头长度(short)+ 消息类型(byte)+ 内容类型(byte) +  消息命令(short)+ 包体长度(int) 包体:JSON字符串 自己定义编码解码:因为数据在网络传输过程中都是以二进制传输的,所以我们能够自己定义