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. 【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群

    写在前边 在搭建Logstash多节点之前,想到就算先搭好Logstash启动会因为日志无法连接到Kafka Brokers而无限重试,所以这里先构建下Zookeeper集群管理的Kafka集群. 众 ...

  2. [LeetCode][Java] Roman to Integer

    题目: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...

  3. 【iOS系列】-UIButton的非常规使用

    [iOS系列]-UIButton的非常规使用 主要介绍UIButton在开发中得小技巧,使用好了,可以达到很奇妙的效果. 1:设置按钮内边距属性,可以呈现出相框的效果 btn.contentEdgeI ...

  4. Java中有多少种设计模式?请简单画一下三种常见设计模式的类图?

    转载:http://blog.csdn.net/longyulu/article/details/9159589 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽 ...

  5. WebService注解汇总

    Web Service 元数据注释(JSR 181) @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值 ...

  6. VS2013如何调用别人发布的WebService程序

    这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料 VS2 ...

  7. 3.5Linux设备驱动--块设备(一)之概念和框架☆☆

    基本概念   块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性 ...

  8. YTU 2900: F-A Simple Question

    2900: F-A Simple Question 时间限制: 1 Sec  内存限制: 128 MB 提交: 66  解决: 24 题目描述 今天,pasher打算在一个浪漫的花园和他的搭档们聚餐, ...

  9. echo 到 stderr

    This question is old, but you could do this, which facilitates reading: >&2 echo "error& ...

  10. vs2013/2015中scanf函数类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

    在使用vs2015时,遇到了scnaf函数安全性的问题,程序不能正常运行,错误如下: error C4996: 'scanf': This function or variable may be un ...