Apache Mina Server 是一个网络通信应用框架,对socket进行了封装。

http://www.cnblogs.com/moonandstar08/p/5475766.html

http://blog.csdn.net/u010739551/article/details/47361365

http://www.cnblogs.com/yanghuiping/p/4108063.html  (mina 自定义编解码)

Client端:

public class MinaClient {

    public static void main(String[] args) throws Exception{
//1.
NioSocketConnector connector = new NioSocketConnector();
//2.
connector.setHandler(new MyClientHandler());
//3.所有收发的消息都会经过拦截器,经拦截器进行消息的处理
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
//4.
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", 9898));
future.awaitUninterruptibly();
IoSession session = future.getSession();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
String inputContent;
while (!(inputContent = inputReader.readLine()).equals("bye")) {
session.write(inputContent);
}
} }

将网络和消息处理的代码分开

public class MyClientHandler extends IoHandlerAdapter {

    @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("exceptionCaught");
} @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String s = (String) message;
System.out.println("messageReceived: " + s);
} @Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
} @Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
} @Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
} @Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
} @Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
} }

Server端:

public class MinaServer {

    public static void main(String[] args) {
try {
//1.
NioSocketAcceptor acceptor = new NioSocketAcceptor();
//2.网络管理和消息处理的分割开来; MyServerHandler()专门处理消息分发和会话管理
acceptor.setHandler(new MyServerHandler());
//3.拦截器,责任链设计模式。所有收发的消息全部要经过拦截器过滤之后,消息才可以收发;
//网络上传输是字节,拦截器做对象的转换工作;
//ProtocolCodecFilter 二进制数据和对象进行转化;MyTextLineFactory()内置的,对传输数据进行加解码
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyTextLineFactory()));
//每隔5秒,检查客户端是否处于空闲狂态,检测客户端是否掉线
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);
//4.服务器端口启动起来,监听9898
acceptor.bind(new InetSocketAddress(9898));
} catch (IOException e) {
e.printStackTrace();
}
} }
public class MyServerHandler extends IoHandlerAdapter {

    @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("exceptionCaught");
} @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String s = (String) message;
System.out.println("messageReceived: " + s);
session.write("server reply: " + s);
} @Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
} @Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed");
} @Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}

//客户端进入空闲状态,检测 客户端 是否掉线
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
} @Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
} }
public class MyTextLineFactory implements ProtocolCodecFactory {

    private MyTextLineDecoder mDecoder;

    private MyTextLineCumulativeDecoder mCumulativeDecoder;

    private MyTextLineEncoder mEncoder;

    public MyTextLineFactory () {
mDecoder = new MyTextLineDecoder();
mEncoder = new MyTextLineEncoder();
mCumulativeDecoder = new MyTextLineCumulativeDecoder();
} @Override
public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
return mCumulativeDecoder;
} @Override
public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
return mEncoder;
} }
public class MyTextLineCumulativeDecoder extends CumulativeProtocolDecoder {

    @Override
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
int startPosition = in.position();
while (in.hasRemaining()) {
byte b = in.get();
if (b == '\n') {
int currentPositoin = in.position();
int limit = in.limit();
in.position(startPosition);
in.limit(currentPositoin);
IoBuffer buf = in.slice();
byte [] dest = new byte[buf.limit()];
buf.get(dest);
String str = new String(dest);
out.write(str);
in.position(currentPositoin);
in.limit(limit);
return true;
}
}
in.position(startPosition);
return false;
} }
public class MyTextLineEncoder implements ProtocolEncoder {

    @Override
public void dispose(IoSession arg0) throws Exception { } @Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out)
throws Exception {
String s =null;
if (message instanceof String) {
s = (String) message;
}
if (s != null) {
CharsetEncoder charsetEndoer = (CharsetEncoder)session.getAttribute("encoder");
if (charsetEndoer == null) {
charsetEndoer = Charset.defaultCharset().newEncoder();
session.setAttribute("encoder", charsetEndoer);
}
IoBuffer ioBuffer = IoBuffer.allocate(s.length());
ioBuffer.setAutoExpand(true);
ioBuffer.putString(s, charsetEndoer);
ioBuffer.flip();
out.write(ioBuffer);
}
} }
public class MyTextLineDecoder implements ProtocolDecoder {

    @Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
throws Exception {
int startPosition = in.position();
while (in.hasRemaining()) {
byte b = in.get();
if (b == '\n') {
int currentPositoin = in.position();
int limit = in.limit();
in.position(startPosition);
in.limit(currentPositoin);
IoBuffer buf = in.slice();
byte [] dest = new byte[buf.limit()];
buf.get(dest);
String str = new String(dest);
out.write(str);
in.position(currentPositoin);
in.limit(limit);
}
}
} @Override
public void dispose(IoSession arg0) throws Exception { } @Override
public void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)
throws Exception { } }

android开发学习——Mina框架的更多相关文章

  1. Android开发学习——Volley框架

    转载至: http://blog.csdn.net/guolin_blog/article/details/17482095 一些概念性的东西 大家进入上边链接理解,我贴一下 具体的实现代码: pub ...

  2. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  3. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  4. Android开发学习路线的七个阶段和步骤

    Android开发学习路线的七个阶段和步骤           Android学习参考路线     第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...

  5. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  6. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  7. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  8. Android开发学习之LauncherActivity开发启动的列表

    Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果:   建立主Activity:OtherActivity.java [jav ...

  9. 最实用的Android开发学习路线分享

    Android开发学习路线分享.Android发展主导移动互联发展进程,在热门行业来说,Android开发堪称火爆,但是,虽然Android有着自身种种优势,但对开发者的专业性要求也是极高,这种要求随 ...

随机推荐

  1. EXCEPT(差集)集合运算

    在集合论中,集合A与B的差集(A-B)是由属于集合A,但不属于集合B的元素组成的集合.可以认为两个集合的差A-B就是从A中减去B中也属于A的元素. 在T-SQL中,集合之差是用EXCEPT集合运算实现 ...

  2. 说说Windows7 64bits下安装TensorFlow GPU版本会遇到的一些坑

    不多说,直接上干货! 再写博文,回顾在Windows7上安装TensorFlow-GPU的一路坑 Windows7上安装TensorFlow的GPU版本后记 欢迎大家,加入我的微信公众号:大数据躺过的 ...

  3. ie6不支持png图片的解决办法

    在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...

  4. Spring Boot Spring 自动配置

    Spring Boot 不是应用服务器: Spring Boot没有实现诸如JPA.JMS(Java Message Service)之类的Java企业级规范: Spring Boot没有引入任何形式 ...

  5. test_action

    [TOP] 为什么百度校招数据挖掘工程师的笔试题目是跟数据挖掘关系不大? - 研究生生活交流 - 王道论坛,专注于计算机考研的点点滴滴! http://www.cskaoyan.com/thread- ...

  6. Perl Compatible Regular Expressions

    http://www.pcre.org/ http://www.pcre.org/

  7. struts2 中 result type="stream"

    Stream result type是Struts2中比较有用的一个feature.特别是在动态生成图片和文档下载的情况下 1:图片验证码: Action类,action主要要提供一个获取InputS ...

  8. (1)数据库和MySql初步认识

    一,数据的保存: 数据可以通过很多方式进行保存,不用的保存方式对于所保存的数据的影响各有不同. 1,数据保存在内存中:读写速度很快:但是随着程序的关闭数据会丢失,而且内存容量相对小,价格昂贵 2,数据 ...

  9. Jackson 框架的高阶应用

    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架.Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson ...

  10. 并不对劲的noip2018

    day1 road 题意 有n(\(n \leq 10^5\))个数\(a_1,a_2,...,a_n\)排成一排,每次可以选择一段大于零的数减一,问最少几次把所有数减为0. 题解 先想到一个简单的策 ...