pache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
第一步:建立服务器连接
这里是最简单的方式
- 需要一个Nio的接受对象:
nioSOcketAcceptor- 需要一个处理器:
该处理器要继承于IoHandlerAdapter(io处理适配器),其中有多个方法用于事件处理- 添加拦截器:
为什么需要连接器,我们知道传统的IO流传输的是二进制字节数组,我们就要像以前那样再去读流写流,用MINA就不用了呀,因为都封装在编码解码器里面,有几种默认的解码工厂,TextLineCodeCFactory用于字符串的解码,可以添加多个拦截器,也可以自己重写解码器,具体看文档- bind绑定端口号
服务端主入口
1 | public static void main(String[] args) throws Exception { |
Io处理器类(MyServerHandler)
1 | public class MyServerHandler extends IoHandlerAdapter { |
最重要的是messageReceived用于接受请求,主要方法中在正常流程中要做其他处理,应该用线程来做,比如在↓sessionOPENED 表示通讯建立后的回调,这时候我就可以在session中写东西到客服端了,我开启一个新的线程SendMessageThread并启动,具体的业务逻辑就可以写在该线程中,用于服务端给客服端发消息
1 | public class SendMessageThread implements Runnable{ |
第二步:建立客服端连接
步骤基本和服务端差不多
- 需要一个连接器;
(NioSocketConnector)- 需要一个处理器;
- 需要一个拦截器;
- 建立连接Socket(ip,端口):
返回值为ConnectFuture(连接结果),因为不一定这个连接能成功,也可以对连接进行处理,关闭啊之类的,也可以在连接中获取到该Session 进行读写
客服端主入口(handler-MinaClientHanlder和服务端大同小异,就不贴出了)
1 | public static void main(String[] args) throws Exception { |
其他的思考
这里都是最简单的处理,客服端和服务端一对一的.
当多个连接时,需要一个类用来装载,所有连接,给连接赋名,用来准确获取该连接.
基本和tcp,udp差不多,客户端间通讯即是服务端转发嘛,也很好理解。
下载链接
- mina 相关jar包 https://github.com/MroZ11/mina/
- 试例源码 https://github.com/MroZ11/mina/