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用户手册中文版——系列文档
http://blog.csdn.net/lxlzhn/article/category/1272213/2
mina 心跳机制
出处:http://wandejun1012.iteye.com/blog/2065941
mina框架详解
http://www.cnblogs.com/gw811/p/4279230.html
Mina系列文章索引(解码解析等,不错)
http://my.oschina.net/ielts0909/blog/92716
二、代码示例
(1)Mina服务端创建步骤
1.建立监听对象
IoAcceptor acceptor=new NioSocketAcceptor();
2.添加Filter(日志,编解码)
acceptor.getFilterChain().addLast("logger",new LoggingFilter());
acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
3.添加Handler处理
acceptor.setHandler(new TimeServerHandler());
4.设置回话参数【输入缓存区Buffer大小,多久进入空闲时间】
acceptor.getSessionConfig.setReadBufferSize(2048);
acceptor.getessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);
5.绑定端口号,开始监听
acceptor.bind(new InetSocketAddress(PORT));
Handler处理类开发
继承IOHandler类或者实现IoHandler接口
客户端Handler,服务端Handler使用同一个IOHandler继承实现。
public TimeServerHandler extends IoHandlerAdapter
{
@Override
public void exceptionCaught(IoSession session,Throwable cause) throws Exception
{
cause.printStackTrace();
}
@Override
public void messageReceived(IoSession session,Object message) throws Exception
{
String str=message.toString();
if(str.trim().equalsIgnoreCase("quit"))
{
session.close();
return ;
}
Date date=new Date();
session.write(date.toString());
System.out.println("Message written...");
}
@Override
public void sessionIdle(IoSession session,IdleStatus status) throws Exception
{
System.out.println("IDLE"+session.getIdleCount(status));
}
}
exceptionCaught方法:捕获错误,简单地打印了错误的堆栈跟踪和关闭会话。
messageReceived方法:来处理从客户端接收到的数据,这里是将当前时间返回给客户端。根据所使用的协议编解码器,object 这个参数传递的类型有所不同,以及返回的数据时的session.write(Object) 也不同。如果不指定协议的编解码器,你将收到一个类型为IoBuffer 的对象,返回的数据也要求是IoBuffer。
sessionIdle方法:空闲状态时,将定时调用一次会话
还有以下几个方法重写
@Override
public void messageSent(IoSession arg0, Object message) throws Exception {
// TODO Auto-generated method stub
System.out.println("client发送信息"+message.toString());
}
@Override
public void sessionClosed(IoSession session) throws Exception {
// TODO Auto-generated method stub
System.out.println("client与:"+session.getRemoteAddress().toString()+"断开连接");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
// TODO Auto-generated method stub
System.out.println("client与:"+session.getRemoteAddress().toString()+"建立连接");
}
@Override
public void sessionOpened(IoSession arg0) throws Exception {
// TODO Auto-generated method stub
System.out.println("打开连接");
}
(2)Mina客户端创建
1.创建客户端连接对象
IoConnector connector=new NioSocketConnector();或者NioSocketConnector connector = new NioSocketConnector();
2.设置过滤器职责链(日志,编解码【多种编解码器】)
connector.getFilterChain().addLast("logger",new LoggingFilter());
connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
也可以使用
ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
3.设置Handler处理
connector.setHandler(new TimeClientHandler());
4.建立Connect连接
ConnectFuture connectFuture=connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
connectFuture.awaitUninterruptibly();
5.获得Session回话
IoSession session=connectFuture.getSession();
6.输入输出操作
以下是接收控制台的输入,获得后发送到服务端
Scanner sc = new Scanner(System.in);
boolean quit = false;
while(!quit){
String str = sc.next();
if(str.equalsIgnoreCase("quit")){
quit = true;
}
session.write(str);
}
7.关闭Session和连接器
if(session!=null){
if(session.isConnected()){
session.getCloseFuture().awaitUninterruptibly();
}
connector.dispose(true);
}
IoConnector connector = new NioSocketConnector();
connector.getFilterChain().addLast( "logger", new LoggingFilter() );
connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new PrefixedStringCodecFactory(Charset.forName("UTF-8"))));
connector.setHandler(new TimeClientHander());
ConnectFuture connectFuture = connector.connect(new InetSocketAddress("127.0.0.1",BaseConfig.PORT));
//等待建立连接
connectFuture.awaitUninterruptibly();
System.out.println("连接成功");
IoSession session = connectFuture.getSession();
Scanner sc = new Scanner(System.in);
boolean quit = false;
while(!quit){
String str = sc.next();
if(str.equalsIgnoreCase("quit")){
quit = true;
}
session.write(str);
}
//关闭
if(session!=null){
if(session.isConnected()){
session.getCloseFuture().awaitUninterruptibly();
}
connector.dispose(true);
}
三、粘包分包处理
有三种常用方法可以将字节流分离成消息:
使用固定长度的消息。
使用固定长度的标头指出消息内容主体的长度。
使用分隔符;例如很多基于文本的消息在消息的后面追加换行(或者CR LF组合) (http://www.faqs.org/rfcs/rfc977.html)
JAVA通信系列二:mina入门总结的更多相关文章
- java‘小秘密’系列(二)---Integer
java'小秘密'系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java'小秘 ...
- Java爬虫系列二:使用HttpClient抓取页面HTML
爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容.上一篇随笔<Java爬虫系列一:写在开始前>中提到了HttpClient可以抓取页面内 ...
- java多线程系列(二)
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- java多线程系列(二)---对象变量并发访问
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- JAVA通信系列三:Netty入门总结
一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问http://news.cnblogs.com/n/205413/ 深入浅出Nettyhtt ...
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
- ActiveMQ入门系列二:入门代码实例(点对点模式)
在上一篇<ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)>中,大致介绍了ActiveMQ和一些概念,并下载.安装.启动他,还访问了他的控制台页面. 这篇,就用代 ...
- shiro实战系列(二)之入门实战续
下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...
- JAVA通信系列一:Java Socket技术总结
本文是学习java Socket整理的资料,供参考. 1 Socket通信原理 1.1 ISO七层模型 1.2 TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...
随机推荐
- 关于几个主流语音SDK的接入问题
这两周都在忙着游戏上线还有接入游戏语音,两周分别接了腾讯语音和百度语音!!! 关于腾讯语音的一些问题 由于发现腾讯语音的在录完音频后的数据是编过码的所以出现了一些问题: *不能解码(腾讯方不提供解码算 ...
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- TypeScript为Zepto编写LazyLoad插件
平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...
- mybatis_个人总结
在使用mybatis框架开发数据访问层的过程中,我在这段时间遇到很多细节问题困住我,在这里我来分享一下我遇到的坑,希望能帮到大家. 一.mybatis动态代理方式开发的规范: 1.注意在mybatis ...
- RIFF和WAVE音频文件格式
RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...
- ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)
原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...
- Boost信号/槽signals2
信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...