文档章节

使用mina框架构建最简单的client工具类

惊天动地的胖子
 惊天动地的胖子
发布于 2017/05/19 16:53
字数 825
阅读 41
收藏 0

最近在工作中使用到了mina框架,在研究众多文章后,自己简单写了一个mina client的工具类,请多多指正。

import org.apache.log4j.Logger;
import org.apache.mina.core.filterchain.IoFilter;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
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.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Socket客户端管理类
 * 通过本类可以实现连接第三方socket服务端,后续开发中只关心业务处理即可
 * @author pangzi
 * @create 2017-05-19 16:25
 */
public class MinaSocketClientManager {
    private final static Logger LOGGER = Logger.getLogger(MinaSocketClientManager.class);
    /**
     * 连接超时时间30s 超过时间提示连接异常
     */
    public final static long TIMEOUT = 30000;

    /**
     * 以异步处理消息方式连接第三方socket服务端
     * 默认UTF-8 编码
     * 在继承IoHandlerAdapter类后,可通过重写 messageReceived,messageSent 来发送和接收消息
     * @param timeout  超时设置,可自行设定也可使用静态变量TIMEOUT
     * @param handler  自定义的继承IoHandlerAdapter的处理类,详细业务逻辑层也在本handler处理
     * @param hostname 第三方socket服务端ip地址
     * @param port     第三方socket服务端ip端口
     * @return
     */
    public static IoSession getSessionSub(int timeout, IoHandlerAdapter handler, String hostname, int port)
    {
        IoSession session = null;
        try {
            NioSocketConnector connector = new NioSocketConnector();
            //默认添加LoggingFilter,ProtocolCodecFilter UTF-8
            connector.getFilterChain().addLast("logger", new LoggingFilter());
            connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
            //设置连接超时检查时间
            connector.setConnectTimeoutCheckInterval(timeout);
            //设置业务逻辑接口
            connector.setHandler(handler);
            // 建立连接,等待连接创建完成
            session = connector.connect(new InetSocketAddress(hostname, port)).awaitUninterruptibly().getSession();
        } catch (Exception e) {
            LOGGER.error("connect ip :"+hostname+"/"+port+" error", e);
        }
        return session;
    }

    /**
     * 以同步处理消息方式连接第三方socket服务端
     * 默认UTF-8 编码  默认消息缓存区 1M
     * 返回连接Session后,可通过 sendAndReadMsg 同步的发送和接收消息
     * @param filters   自定义业务处理过滤器组
     * @param timeout   超时设置,可自行设定也可使用静态变量TIMEOUT
     * @param hostname  第三方socket服务端ip地址
     * @param port      第三方socket服务端ip端口
     * @param code      编码格式 utf-8 或 gbk,gb2312 等格式
     * @return
     */
    public static IoSession getSessionSub(Map<String,IoFilter> filters, int timeout, String hostname, int port, String code)
    {
        IoSession session = null;
        try {
            NioSocketConnector  connector = new NioSocketConnector();
            //默认添加LoggingFilter,ProtocolCodecFilter UTF-8
            connector.getFilterChain().addLast("logger", new LoggingFilter());
            connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName(code))));
            //其他过滤器自行添加
            if (filters != null ) {
                Iterator<Map.Entry<String, IoFilter>> it = filters.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<String, IoFilter> pairs = it.next();
                    connector.getFilterChain().addLast(pairs.getKey(), pairs.getValue());
                }
            }
            //同步客户端
            connector.getSessionConfig().setUseReadOperation(true);
            //接收缓冲区1M
            connector.getSessionConfig().setReceiveBufferSize(1024*1024);
            //设置连接超时检查时间
            connector.setConnectTimeoutCheckInterval(timeout);
            // 建立连接,等待连接创建完成
            session = connector.connect(new InetSocketAddress(hostname, port)).awaitUninterruptibly().getSession();
        } catch (Exception e) {
            LOGGER.error("connect ip :"+hostname+"/"+port+" error", e);
        }
        return session;
    }


    /**
     * 发送并接收返回消息,用于处理同步连接
     * @param session session连接 通过getSessionSub获得的同步连接对象
     * @param timeout 消息发送或接收的超时设置,超时则提示soecket连接异常
     * @param unit    超时时间的单位 TimeUnit.MILLISECONDS等
     * @param sendMsg 需要发送的消息
     * @return  返回消息
     */
    public static String sendAndReadMsg(IoSession session, long timeout, TimeUnit unit, String sendMsg)
    {
        String retMsg = null;
        try{
            if ( session!=null && session.isConnected() )
            {
                //发送
                LOGGER.info("socket from ip:"+session.getLocalAddress()+" to ip:"+session.getRemoteAddress()+" sendMsg is {"+sendMsg+"}");
                session.write(sendMsg).awaitUninterruptibly(timeout, TimeUnit.MILLISECONDS);
                //接收
                ReadFuture readFuture = session.read();
                if (readFuture.awaitUninterruptibly(timeout, TimeUnit.MILLISECONDS)) {
                    retMsg =readFuture.getMessage().toString();
                    LOGGER.info("socket from ip:"+session.getLocalAddress()+" to ip:"+session.getRemoteAddress()+" retMsg is {"+retMsg+"}");
                }
            }
        } catch (Exception e)
        {
            LOGGER.error("SOCKET连接异常", e);
        }
        return retMsg;
    }

    /**
     * 关闭Session
     * @param session 异步或同步连接
     */
    public void closeSession(IoSession session)
    {
        if (session !=null) {
            // 等待连接断开
            session.getCloseFuture().awaitUninterruptibly();
            session.close(true);
            session.getService().dispose();
        }
    }
}

© 著作权归作者所有

惊天动地的胖子
粉丝 0
博文 21
码字总数 28226
作品 0
成都
私信 提问
Mina源码阅读笔记(三)-Mina的连接IoAccpetor

接着上篇《IoBuffer的封装》. 其实在mina的源码中,IoService可以总结成五部分service责任、Processor线程处理、handler处理器、接收器和连接器,分别对应着IoService、IoProcessor、IoHandl...

Gaischen
2012/11/21
0
7
Java分布式框架netty之NIO框架区别分析

Netty概述: 1、netty是基于Java NIO的网络应用框架,client-server框架 2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持, 作为一个异步NIO框架,Netty...

架构师springboot
2018/11/12
0
0
j2ee 框架 bbossgroups 1.0 发布

bbossgroups 包含以下子项目 1.bboss-persistent, a persistent framework(持久层框架). 参考bbossgroups框架来实现持久层的操作: a.灵活的事务管理(声明式事务管理,可编程事务管理,j...

bboss
2010/03/30
0
0
Jack Jiang/MobileIMSDK

快捷目录 ▌ 网络理论 网络编程理论经典《TCP/IP详解》(在线阅读版) ▌ 相关资料 MobileIMSDK版本更新日志 MobileIMSDK常见问题解答 MobileIMSDK性能测试报告 客户端Demo安装和使用帮助(An...

Jack Jiang
2015/11/27
0
0
CIM 3.5.0 版本更新,全面重写 websocket 实现

项目介绍 CIM是基于mina和netty框架下的推送系统,我们平常使用第三方的推送SDK,如极光推送,百度推送,小米推送,以及腾讯信鸽等来支撑自己的移动端的业务,或许有一些用户自己实现即时通讯...

远方夕阳
2018/08/24
797
4

没有更多内容

加载失败,请刷新页面

加载更多

Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部