mina简单实用_Mina入门实例(一)
mina现在用的很多了,之前也有用到,但是毕竟不熟悉,于是查了一些资料,做了一些总结。看代码是最直观的,比什么长篇大论都要好。不过其中重要的理论,也要理解下。
首先是环境,程序运行需要几个包,这里用maven比较方便。
pom.xml:
4.0.0
MyMinaServer
mina
0.0.1-SNAPSHOT
jar
mina
http://maven.apache.org
UTF-8
org.apache.mina
mina-core
2.0.4
org.slf4j
jcl-over-slf4j
1.6.1
org.slf4j
slf4j-nop
1.6.1
junit
junit
3.8.1
test
然后就可以写代码了。
---------------------------------------------------------- 分割线 -----------------------------------------------------------------------------------------
一,简单的客户端和服务端程序
服务端程序:
packageMyMinaServer.mina;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.charset.Charset;importorg.apache.mina.core.service.IoAcceptor;importorg.apache.mina.core.session.IdleStatus;importorg.apache.mina.filter.codec.ProtocolCodecFilter;importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;importorg.apache.mina.filter.logging.LoggingFilter;importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;public classMainServer {private static final int Port=8888;public static voidmain(String[] args) {
IoAcceptor ioAcceptor=newNioSocketAcceptor();
System.out.println("begin server....");
ioAcceptor.getFilterChain().addLast("logger", newLoggingFilter());
ioAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
ioAcceptor.setHandler(newHelloWorldHandler());
ioAcceptor.getSessionConfig().setReadBufferSize(2048);
ioAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);try{
ioAcceptor.bind(newInetSocketAddress(Port));
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端,创建连接,然后这里注册了几个过滤链,这里简单写了需要的两个,到后面的内容中还可以加入一个加密的ssl链。
其中重要的是setHandler这个,在这个里面,我们可以定义自己的handler,然后做自己的业务。下面有这个handler的简单代码。
最后设置session的缓冲,和idle(空闲处理)的设定,再为此连接绑定一个端口。
其中需要注意的是,在服务端和客户端的代码里面,如果要传递string信息,codec编码过滤器中,要这么写:new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))。否则报错。
业务处理的handler:
packageMyMinaServer.mina;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IdleStatus;importorg.apache.mina.core.session.IoSession;public class HelloWorldHandler extendsIoHandlerAdapter{
@Overridepublic voidexceptionCaught(IoSession session, Throwable cause)throwsException {//TODO Auto-generated method stub
super.exceptionCaught(session, cause);
}
@Overridepublic voidmessageReceived(IoSession session, Object message)throwsException {//TODO Auto-generated method stub
String string=message.toString();if (string.trim().equalsIgnoreCase("quit")) {
session.close(true);return;
}
System.out.println("recevied message:"+string);
String reply=" hi, i am server";
session.write(reply);
System.out.println("message have been written");
}
@Overridepublic void messageSent(IoSession session, Object message) throwsException {//TODO Auto-generated method stub
System.out.println("message have been sent");
}
@Overridepublic void sessionClosed(IoSession session) throwsException {//TODO Auto-generated method stub
System.out.println("closed session");
}
@Overridepublic void sessionCreated(IoSession session) throwsException {//TODO Auto-generated method stub
System.out.println("session created");
}
@Overridepublic voidsessionIdle(IoSession session, IdleStatus status)throwsException {//TODO Auto-generated method stub
System.out.println("IDLE "+session.getIdleCount(status));
}
@Overridepublic void sessionOpened(IoSession session) throwsException {//TODO Auto-generated method stub
System.out.println("session opened");
}
}
这里的每个方法,算是事件。在每个事件中,我们可以定义自己的处理。在前面的《AndroidPn源码分析(一)》这篇文章中,笔者曾写过他们的每个事件代表的含义,不过从字面意思也很好理解。
这里主要是对接受到信息的处理,如果不是收到quit字符,则返回给客户端一句 hi,i am server。
服务端暂时到此,以下是客户端。
packagecom.example.mina.server;importjava.net.InetSocketAddress;importjava.nio.charset.Charset;importorg.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;importorg.apache.mina.core.future.CloseFuture;importorg.apache.mina.core.future.ConnectFuture;importorg.apache.mina.core.session.IoSession;importorg.apache.mina.filter.codec.ProtocolCodecFilter;importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;importorg.apache.mina.filter.logging.LoggingFilter;importorg.apache.mina.transport.socket.SocketConnector;importorg.apache.mina.transport.socket.nio.NioSocketConnector;importcom.example.mina.charset.CharsetFactory;importcom.example.mina.hanlder.MsgHanler;public classMinaClient {privateSocketConnector connector;privateConnectFuture future;privateIoSession session;public booleanconnect() {/** 1.创建一个socket连接,连接到服务器*/connector= newNioSocketConnector();/** 获取过滤器链,用于添加过滤器*/DefaultIoFilterChainBuilder chain=connector.getFilterChain();//b.添加日志过滤器
chain.addLast("logger", newLoggingFilter());//c.添加字符的编码过滤器
chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));/** 3.设置消息处理器,用于处理接收到的消息*/connector.setHandler(newMsgHanler());/** 4.根据IP和端口号连接到服务器*/future= connector.connect(new InetSocketAddress("127.0.0.1", 8888));//等待连接创建完成
future.awaitUninterruptibly();/** 5.获取session对象,通过session可以向服务器发送消息;*/session=future.getSession();
session.getConfig().setUseReadOperation(true);returnfuture.isConnected();
}/*** 往服务器发送消息
*
*@parammessage*/
public voidsendMsg2Server(String message) {
session.write(message);
}/*** 关闭与服务器的连接
*
*@return
*/
public booleanclose() {
CloseFuture future=session.getCloseFuture();
future.awaitUninterruptibly(1000);
connector.dispose();return true;
}
}
然后同样是一个客户端的handler,和server的很像:
packagecom.example.mina.hanlder;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IoSession;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;public class MsgHanler extendsIoHandlerAdapter {private static final Logger log = LoggerFactory.getLogger(MsgHanler.class);
@Overridepublic voidexceptionCaught(IoSession session, Throwable cause)throwsException {//出现异常
log.error("--------exception--------");super.exceptionCaught(session, cause);
}
@Overridepublic voidmessageReceived(IoSession session, Object message)throwsException {//从服务器中接收到消息后的处理
log.info("--------msg receive--------");
log.info("Message:{}" +message.toString());super.messageReceived(session, message);
}
@Overridepublic void messageSent(IoSession session, Object message) throwsException {//往服务器中发送消息
log.info("--------msg sent--------");super.messageSent(session, message);
}
@Overridepublic void sessionCreated(IoSession session) throwsException {//当session被创建的时候调用
log.info("--------session create--------");super.sessionCreated(session);
}
}
写一个入口方法:
packagecom.example.mina.server;public classMain {public static voidmain(String[] args) {
MinaClient client=newMinaClient();
client.connect();
client.sendMsg2Server("message from cilent");
}
}
这样,客户端就可以工作了。
先启动服务端,然后启动客户端,就可以看到在两个控制台中,分别有交互信息。
服务端:
begin server....
session created
session opened
recevied message:message from cilent
message have been written
message have been sent
客户端:
[QC] INFO [NioProcessor-2] org.apache.mina.filter.logging.LoggingFilter.log(186) | CREATED
[QC] INFO [NioProcessor-2] com.example.mina.hanlder.MsgHanler.sessionCreated(54) | --------session create--------
[QC] INFO [NioProcessor-2] org.apache.mina.filter.logging.LoggingFilter.log(186) | OPENED
[QC] INFO [NioProcessor-2] org.apache.mina.filter.logging.LoggingFilter.log(157) | SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
[QC] INFO [NioProcessor-2] com.example.mina.hanlder.MsgHanler.messageSent(47) | --------msg sent--------
[QC] INFO [NioProcessor-2] org.apache.mina.filter.logging.LoggingFilter.log(157) | RECEIVED: HeapBuffer[pos=0 lim=17 cap=2048: 20 68 69 2C 20 69 20 61 6D 20 73 65 72 76 65 72...]
[QC] INFO [NioProcessor-2] com.example.mina.hanlder.MsgHanler.messageReceived(39) | --------msg receive--------
[QC] INFO [NioProcessor-2] com.example.mina.hanlder.MsgHanler.messageReceived(40) | Message:{} hi, i am server
客户端因为用了log4j,打印比较多信息。
到此,这个例子就完成了。
mina简单实用_Mina入门实例(一)相关推荐
- 超级简单的Swift5入门实例
Swift已经版本5了,越来越普及,作为一只一直写OC的猿,很有必要学习下,花了点时间写了下基础的Swift,之前看Swift语法也有几次了,但是不用一下就忘记了,果然还是动手才是真的,看东西比较虚, ...
- JMS(二):简单的JMS入门实例
为什么80%的码农都做不了架构师?>>> public class Test1 {public static void main(String[] args) throws J ...
- Informatica ETL开发入门实例
一.ETL开发前准备工作 注:Informatica的存储服务和集成服务必须已经启动,客户端才能连接并进行ETL实例开发 客户端工具: PowerCenter Designer:D客户端 PowerC ...
- matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...
近期疫情原因,工作比较不忙,所以打算出一套零基础,VB.NET实例系列入门教程,实用又好玩,带大家进入VB的编程世界里,希望这套图文教程能帮到有需要的人! 第一节(简单实用抽奖程序) 内容准备:编译环 ...
- visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)
近期疫情原因,工作比较不忙,所以打算出一套零基础,VB.NET实例系列入门教程,实用又好玩,带大家进入VB的编程世界里,希望这套图文教程能帮到有需要的人! 第一节(简单实用抽奖程序) 内容准备:编译环 ...
- python读取excel表格-python读写Excel表格的实例代码(简单实用)
安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xlrd 2.python写excel--xlwt 1.读excel数据,包括日期等数据 ...
- php注入类,简单实用的PHP防注入类实例
这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注入类 ...
- ajax 示例代码,Ajax的简单实用实例代码
我将实现一个简单的Ajax页面无刷新进行用户验证案例: 效果如下图: 实现主要过程: 在UsersAction类中的checkUser方法中接收并验证前台的表单数据,针对不同情况,返回一个状态码cod ...
- ul、li列表简单实用代码实例
利用ul和li可以实现列表效果,下面就是一个简单的演示. 代码如下: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
最新文章
- 重温强化学习之OpenAI经典场景
- 银行祖传系统重构实例:创立12年,只支持Python 2,跑着500多个应用程序
- SharpStrike:基于C#实现的后渗透漏洞利用工具
- 修改Smartfroms默认文本编辑器
- 平底方向盘比圆形方向盘好在哪?
- 转盘抽奖(主要:概率和JQ)
- GIMP永久保存选择的办法
- iframe在ipad safari的显示
- jQuery本身方法($.each,$.map,$.contains,$ajax)
- 算法题存档20191223
- jQuery迷你帮助查找功能
- 只有低价才是中国智能硬件的出路吗?
- 高校成绩管理数据库系统
- 编写Dockerfile来构建nginx:latest镜像
- Android O/P/Q 版本移植iperf网络性能测试工具
- 浏览器的储存方式有哪些
- 基本算法总结,力扣题目整理
- nginx正向代理https
- android系统库
- java中写定时任务