android开发学习——Mina框架
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框架的更多相关文章
- Android开发学习——Volley框架
转载至: http://blog.csdn.net/guolin_blog/article/details/17482095 一些概念性的东西 大家进入上边链接理解,我贴一下 具体的实现代码: pub ...
- Android开发学习路线图
Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习路线的七个阶段和步骤
Android开发学习路线的七个阶段和步骤 Android学习参考路线 第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- Android开发学习总结(一)——搭建最新版本的Android开发环境
Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...
- Android开发学习之LauncherActivity开发启动的列表
Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果: 建立主Activity:OtherActivity.java [jav ...
- 最实用的Android开发学习路线分享
Android开发学习路线分享.Android发展主导移动互联发展进程,在热门行业来说,Android开发堪称火爆,但是,虽然Android有着自身种种优势,但对开发者的专业性要求也是极高,这种要求随 ...
随机推荐
- 使用 maskView 设计动画
1.maskView(maskLayer) 基本原理 :可类比于多张png图片叠加遮罩 2.maskView配合CAGradientLayer,alpha通道图片的使用.maskView是iOS8以上 ...
- Eclipse中jvm执行库的Access restriction问题的解决方法
今天在写代码的时候遇到了jre system libraries的訪问限制问题,该库是jvm执行的依赖库rt.jar,解决方式例如以下: 步骤: (1)项目右击.出现Build Path.点击进入Ja ...
- Hadoop0.20.203.0在关机重启后,namenode启动报错(/dfs/name is in an inconsistent state)
Hadoop0.20.203.0在关机重启后,namenode启动报错: 2011-10-21 05:22:20,504 INFO org.apache.hadoop.hdfs.server.comm ...
- Django 使用UEditor
Django package 的一些包不支持upload file, 而且 有几个支持的不是收费的就是要开csrf ,这对于苦逼程序猿来说始终是件恼火的事.所以经过查阅各种资料.看了各种各样的配置do ...
- Latex 2: 解决WinEdt和TexWorks用久之后忽然不能正反向搜索
说明:下面说的WinEdt版本是10.1,TexWorks是texlive2016中自带的texworks,如果情况不一样请自行测试,原理一样 1.不能正向搜索: 解决:① 确定路径名是英文名(实际上 ...
- (19)javaWeb项目名称修改
1,选中项目,[右键]-[Refactor]-[Rename] 在弹出面板中,填写New Name 点击[OK] 2,改变运行时目录名称 选中项目[右键]-[Properties] 在弹框中选择选择[ ...
- file结构体中private_data指针的疑惑【转】
本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...
- linux下Apache默认安装路径
如果采用RPM包安装,安装路径应在 /etc/httpd目录下apache配置文件:/etc/httpd/conf/httpd.conf 可以修改相关的访问路径及配置Apache模块路径:/usr/ ...
- BZOJ_2434_[Noi2011]阿狸的打字机_AC自动机+出栈入栈序+树状数组
BZOJ_2434_[Noi2011]阿狸的打字机_AC自动机+出栈入栈序+树状数组 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印 ...
- pymemcache get start
Getting started! A comprehensive, fast, pure-Python memcached client library. Basic Usage from pymem ...