一.MINA框架简介
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工 作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前 已经发布了M1版本。
MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的 松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容 易。
二.MINA框架的常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方法 定义
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发
三.服务端应用开发示例
所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M6.jar。
1)、首先定义一个业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。代码如下:
TimeServerHandler :
- import java.util.Date;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;
- public class TimeServerHandler extends IoHandlerAdapter {
- public void sessionCreated(IoSession session) {
- // 显示客户端的ip和端口
- System.out.println(session.getRemoteAddress().toString()+"1111111111111");
- }
- @Override
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- String str = message.toString();
- System.out.println("str:"+str);
- if (str.trim().equalsIgnoreCase("quit")) {
- session.close();
- // 结束会话return;
- }
- Date date = new Date();
- session.write(date.toString());
- // 返回当前时间的字符串
- System.out.println("Message written..."+"2222222222");
- }
- }
MinaTimeServer:
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.nio.charset.Charset;
- import org.apache.mina.core.service.IoAcceptor;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
- import org.apache.mina.filter.logging.LoggingFilter;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- public class MinaTimeServer {
- private static final int PORT = 9123;// 定义监听端口
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- // TODO Auto-generated method stub
- IoAcceptor acceptor = new NioSocketAcceptor();
- acceptor.getFilterChain().addLast("logger", new LoggingFilter());
- acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 指定编码过滤器
- acceptor.setHandler(new TimeServerHandler()); // 指定业务逻辑处理器
- acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT)); // 设置端口号
- acceptor.bind();// 启动监听}
- }
- }
2)、客户端代码:
TimeClientHandler:
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;
- public class TimeClientHandler extends IoHandlerAdapter{
- public TimeClientHandler() {}
- @Override
- public void messageReceived(IoSession session, Object message) throws Exception {
- System.out.println(message);// 显示接收到的消息
- }
- }
MinaTimeClient:
- import java.net.InetSocketAddress;
- import java.nio.charset.Charset;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
- import org.apache.mina.filter.logging.LoggingFilter;
- import org.apache.mina.transport.socket.nio.NioSocketConnector;
- public class MinaTimeClient {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // 创建客户端连接器.
- NioSocketConnector connector = new NioSocketConnector();
- connector.getFilterChain().addLast( "logger", new LoggingFilter() );
- connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); //设置编码过滤器
- connector.setConnectTimeout(30);
- connector.setHandler(new TimeClientHandler());//设置事件处理器
- ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1", 9123));//建立连接
- cf.awaitUninterruptibly();//等待连接创建完成
- cf.getSession().write("hello");//发送消息
- cf.getSession().write("quit");//发送消息
- cf.getSession().getCloseFuture().awaitUninterruptibly();//等待连接断开
- connector.dispose();
- }
- }
*MINA传输对象:
1)、建立两个工程代码组织如下:
传输对象:
UserInfo:
- package Mina.Object;
- public class UserInfo implements java.io.Serializable{
- private String name;
- private String QQNum;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getQQNum() {
- return QQNum;
- }
- public void setQQNum(String qQNum) {
- QQNum = qQNum;
- }
- }
客户端代码:
- package Mina.client;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;
- import Mina.Object.UserInfo;
- public class ClientHandler extends IoHandlerAdapter {
- private static ClientHandler samplMinaClientHandler = null;
- public static ClientHandler getInstances() {
- if (null == samplMinaClientHandler) {
- samplMinaClientHandler = new ClientHandler();
- }
- return samplMinaClientHandler;
- }
- private ClientHandler() {
- }
- public void sessionOpened(IoSession session) throws Exception {
- session.write("客户端与服务器的会话打开了……");
- UserInfo text=new UserInfo();
- text.setName("梅竹寒香");
- text.setQQNum("972341215");
- session.write(text);
- }
- public void sessionClosed(IoSession session) {
- }
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- }
- public void messageSent(IoSession arg0, Object arg1) throws Exception {
- System.out.println("客户端已经向服务器发送了:"+(String)arg1);
- }
- }
MainClient:
- package Mina.client;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
- import org.apache.mina.transport.socket.nio.NioSocketConnector;
- public class MainClient {
- private static MainClient mainClient = null;
- NioSocketConnector connector = new NioSocketConnector();
- DefaultIoFilterChainBuilder chain = connector.getFilterChain();
- public static MainClient getInstances() {
- if (null == mainClient) {
- mainClient = new MainClient();
- }
- return mainClient;
- }
- private MainClient() {
- chain.addLast("myChin", new ProtocolCodecFilter(
- new ObjectSerializationCodecFactory()));
- connector.setHandler(ClientHandler.getInstances());
- connector.setConnectTimeout(30);
- ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
- 8888));
- }
- public static void main(String args[]) {
- MainClient.getInstances();
- }
- }
服务器端:
ServerHandler:
- package Mina.server;
- import org.apache.mina.core.filterchain.IoFilterAdapter;
- import org.apache.mina.core.service.IoHandler;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;
- import Mina.Object.UserInfo;
- public class ServerHandler extends IoFilterAdapter implements IoHandler {
- private static ServerHandler samplMinaServerHandler = null;
- public static ServerHandler getInstances() {
- if (null == samplMinaServerHandler) {
- samplMinaServerHandler = new ServerHandler();
- }
- return samplMinaServerHandler;
- }
- private ServerHandler() {
- }
- // 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发
- public void sessionOpened(IoSession session) throws Exception {
- }
- public void sessionClosed(IoSession session) {
- }
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- if (message instanceof UserInfo) {
- UserInfo text = (UserInfo) message;
- System.out.println("服务器接收到从客户端的姓名:"+text.getName());
- System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());
- }
- }
- public void exceptionCaught(IoSession arg0, Throwable arg1)
- throws Exception {
- }
- // 当消息传送到客户端后触发
- public void messageSent(IoSession arg0, Object arg1) throws Exception {
- }
- // 当一个新客户端连接后触发此方法.
- public void sessionCreated(IoSession arg0) throws Exception {
- }
- // 当连接空闲时触发此方法.
- public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {
- }
- }
MainServer:
- package Mina.server;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
- import org.apache.mina.transport.socket.SocketAcceptor;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
- public class MainServer {
- private static MainServer mainServer = null;
- private SocketAcceptor acceptor = new NioSocketAcceptor();
- private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
- private int bindPort = 8888;
- public static MainServer getInstances() {
- if (null == mainServer) {
- mainServer = new MainServer();
- }
- return mainServer;
- }
- private MainServer() {
- chain.addLast("myChin", new ProtocolCodecFilter(
- new ObjectSerializationCodecFactory()));
- acceptor.setHandler(ServerHandler.getInstances());
- try {
- acceptor.bind(new InetSocketAddress(bindPort));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws Exception {
- MainServer.getInstances();
- }
- }
相关推荐
总结来说,这个“mina消息推送例子”展示了如何利用Apache Mina作为基础,结合Spring的管理能力,构建一个能够实现实时消息推送的系统。通过理解Mina的异步事件模型和Spring的组件管理,我们可以高效地设计和实现高...
Apache Mina是一个开源项目,主要用于构建高性能、高可用性的网络应用程序。这个例子是关于如何使用Apache Mina实现一个简单的服务端和客户端通信的示例。在这个案例中,`MinaTimeServer`是服务端程序,它负责监听...
Apache Mina是一个开源的网络通信应用框架,主要应用于构建高性能、高可用性的网络服务器和客户端。这个"mina权威性能测试例子"是针对Apache Mina的一个实际性能测试案例,旨在展示在特定环境下Mina如何处理大量并发...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序。MINA 提供了一套高级的网络编程抽象层,简化了开发过程,特别是对于那些处理TCP/IP...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序。这个"mina通讯例子"展示了如何利用MINA库来实现客户端与服务器之间的对象通信。 ...
Mina(Minimum Asynchronous Network)是一个开源的Java框架,主要用于构建高性能、高可用性的网络应用程序,尤其适合于TCP/IP协议栈的应用,如FTP、SMTP、NNTP等网络服务。它提供了一个事件驱动、非阻塞I/O的模型,...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序。MINA 提供了一套高级的网络编程抽象层,让开发者可以专注于业务逻辑,而不是底层的...
通过这些例子,开发者可以快速上手MINA,学习如何创建会话管理、处理网络事件、实现自定义协议等。 `easymock-1.2_Java1.3.jar`和`easymock-1.2_Java1.3-sources.jar`是EasyMock的早期版本,一个流行的Java单元测试...
最近做rfid读写,C#和java都用udp不用厂家的动态库,udp自己写也简单,但是试了一下Apache mina ,接收的不是string,二十byte[] 数组,简单实现了UDP,网上也有例子,但是不是我要的。可用。
MINA (Java Multithreaded Network Application Framework) 是一个基于NIO的开源框架,它为开发高性能、高可用性的网络应用提供了抽象层。MINA 提供了事件驱动的模型,简化了网络编程的复杂性,开发者可以通过编写...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序,特别是TCP和UDP协议的应用。MINA 提供了一种抽象层,使得开发者可以专注于应用逻辑...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,主要设计用于开发高性能、高可用性的网络应用程序。MINA提供了一种与传输协议无关的抽象层,使得开发者可以轻松地构建基于TCP...
在压缩包中的"Mina例子",可能是以源码形式提供的一系列Mina应用场景,例如简单的Echo服务、文件传输服务等。通过阅读和运行这些示例,开发者可以快速了解Mina的工作机制,并学习如何在自己的项目中应用。 总的来说...
Mina是一个开源的Java网络应用框架,常用于创建高性能、高可用性的网络服务器,如TCP/IP和UDP通信。 **描述分析:** 描述中提到,该示例是通过Mina作为服务端来处理客户端的断网和断电情况。这通常涉及到网络连接的...
Apache Mina是一个用Java编写的网络通信框架,它简化了创建高性能、高可用性的网络应用。在这个例子中,我们可能会看到如何使用Mina来建立服务器和客户端之间的通信。 在描述中提到的链接是一个博客文章,虽然没有...
Apache Mina是一个高性能的网络应用框架,用于简化网络编程。Mina通过提供一个抽象层来帮助开发者构建可扩展的网络应用,这些应用可以是基于TCP/IP或UDP/IP协议的服务器和客户端。Mina使用Java NIO(New I/O)作为...
Apache Mina是一个开源的网络通信框架,它为Java开发者提供了构建高性能、高可用性的网络应用程序的工具。在本篇文章中,我们将深入探讨Mina的核心概念和关键特性,以及如何通过实例应用"MinaDemo03"来更好地理解其...
在Java开发中,我们可以使用多种库来实现SSH连接,如JSch、Apache MINA或JCraft。这个例子很可能是使用JSch库,因为它是Java中常用的SSH库,可以方便地进行SSH连接、文件传输和远程执行命令。 下面是一些关于SSH...
总结起来,"短消息发送库C#例子代码"是一个基于C#的短信发送解决方案,利用事件驱动编程模型,自动识别通信端口,并且专为上海蓝峰电子的GSM modem设计。通过理解和应用这个库,开发者可以轻松地在自己的C#应用程序...
当Consumer有多个可用的Provider时,可以根据这些策略选择一个合适的实例进行调用,以分摊服务压力。 7. **监控与管理**:Dubbo还提供了服务治理功能,如服务降级、熔断、限流等,以应对高并发、故障恢复等场景。...