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入门实例(一)相关推荐

  1. 超级简单的Swift5入门实例

    Swift已经版本5了,越来越普及,作为一只一直写OC的猿,很有必要学习下,花了点时间写了下基础的Swift,之前看Swift语法也有几次了,但是不用一下就忘记了,果然还是动手才是真的,看东西比较虚, ...

  2. JMS(二):简单的JMS入门实例

    为什么80%的码农都做不了架构师?>>>    public class Test1 {public static void main(String[] args) throws J ...

  3. Informatica ETL开发入门实例

    一.ETL开发前准备工作 注:Informatica的存储服务和集成服务必须已经启动,客户端才能连接并进行ETL实例开发 客户端工具: PowerCenter Designer:D客户端 PowerC ...

  4. matlab简单程序实例_visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)...

    近期疫情原因,工作比较不忙,所以打算出一套零基础,VB.NET实例系列入门教程,实用又好玩,带大家进入VB的编程世界里,希望这套图文教程能帮到有需要的人! 第一节(简单实用抽奖程序) 内容准备:编译环 ...

  5. visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)

    近期疫情原因,工作比较不忙,所以打算出一套零基础,VB.NET实例系列入门教程,实用又好玩,带大家进入VB的编程世界里,希望这套图文教程能帮到有需要的人! 第一节(简单实用抽奖程序) 内容准备:编译环 ...

  6. python读取excel表格-python读写Excel表格的实例代码(简单实用)

    安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xlrd 2.python写excel--xlwt 1.读excel数据,包括日期等数据 ...

  7. php注入类,简单实用的PHP防注入类实例

    这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注入类 ...

  8. ajax 示例代码,Ajax的简单实用实例代码

    我将实现一个简单的Ajax页面无刷新进行用户验证案例: 效果如下图: 实现主要过程: 在UsersAction类中的checkUser方法中接收并验证前台的表单数据,针对不同情况,返回一个状态码cod ...

  9. 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 ...

最新文章

  1. 重温强化学习之OpenAI经典场景
  2. 银行祖传系统重构实例:创立12年,只支持Python 2,跑着500多个应用程序
  3. SharpStrike:基于C#实现的后渗透漏洞利用工具
  4. 修改Smartfroms默认文本编辑器
  5. 平底方向盘比圆形方向盘好在哪?
  6. 转盘抽奖(主要:概率和JQ)
  7. GIMP永久保存选择的办法
  8. iframe在ipad safari的显示
  9. jQuery本身方法($.each,$.map,$.contains,$ajax)
  10. 算法题存档20191223
  11. jQuery迷你帮助查找功能
  12. 只有低价才是中国智能硬件的出路吗?
  13. 高校成绩管理数据库系统
  14. 编写Dockerfile来构建nginx:latest镜像
  15. Android O/P/Q 版本移植iperf网络性能测试工具
  16. 浏览器的储存方式有哪些
  17. 基本算法总结,力扣题目整理
  18. nginx正向代理https
  19. android系统库
  20. java中写定时任务

热门文章

  1. 永磁同步电机基本控制方法
  2. SpringBoot整合JWT实现API身份校验
  3. hexo静态网站部署到腾讯云cos
  4. 美国的人工智能企业在研发哪些有趣的AI产品?
  5. Pomelo Redis
  6. 实战:深度解析 淘宝打造爆款之淘客推广
  7. Mysql 查询数据库容量大小的方法步骤
  8. 人生之路 — 像狼一样追逐梦想,像羊一样享受生活
  9. 【框架学习】spring简介
  10. 关于c-string类