IoService(Inf)
|
|==AbstractIoService --IoAcceptor -----IoConnector
| | | |
| |-----------|==AbstractIoAcceptor |==AbstractIoConnector
|
|==NioSocketAcceptor |==NioSocketConnector
|==NioDatagramAcceptor |==NiooDatagramConnector
|==VmPipeAcceptor |==VmPipeConnector
图例:
=== 表示: implements
---- 表示: extends
一个非常好的入门的例子:http://mina.apache.org/tutorial-on-protocolcodecfilter-for-mina-2x.html
out-of-box examples:
例题一、Reverser Text protocol based on a protocol codec Server
public class Main {
private static final int PORT = 8080; public static void main(String[] args) throws Exception { NioSocketAcceptor acceptor = new NioSocketAcceptor(); // Prepare the configuration acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8")))); // Bind acceptor.setHandler(new ReverseProtocolHandler()); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("Listening on port " + PORT); } }
public class ReverseProtocolHandler extends IoHandlerAdapter { @Override public void exceptionCaught(IoSession session, Throwable cause) { // Close connection when unexpected exception is caught. session.close(); } @Override public void messageReceived(IoSession session, Object message) { // Reverse reveiced string String str = message.toString(); StringBuffer buf = new StringBuffer(str.length()); for (int i = str.length() - 1; i >= 0; i--) { buf.append(str.charAt(i)); } // and write it back. session.write(buf.toString()); } }
运行测试:(建议使用SocketTestv2.0.0作为客户端进行测试)
运行结果:
Listening on port 8080
12924 [NioProcessor-1] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED
12924 [NioProcessor-1] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED
42696 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED
42696 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED
42696 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - RECEIVED: HeapBuffer[pos=0 lim=298 cap=2048: 47 45 54 20 68 74 74 70 3A 2F 2F 77 77 77 2E 73...]
42727 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - SENT: HeapBuffer[pos=0 lim=146 cap=147: 30 2E 31 2F 50 54 54 48 20 30 30 46 30 35 32 39...]
42727 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
例题二、SumUp Server
需求:客户端不断发送AddMessage,服务端把这些AddMessage中传递过来的数据进行累加,并客户端每发一个AddMessage请求,服务端都把最后的累加和返回给客户端,服务端给客户端会送的报文格式是ResultMessage。由于两者都有个报文序号所以被抽象了一个公共基类。
AddMessage(seqnum,addValue);
ResultMessage(seqnum,retcode,sumValue)
另外,报文序列化方面我们同时支持两种,由用户进行配置,一种是采用java的对象流;另一种是用户自定义的codec.
public abstract class AbstractMessage implements Serializable {//以支持对象序列化 private int sequence;//报文序列号 public int getSequence() { return sequence; } public void setSequence(int sequence) { this.sequence = sequence; } }
public class AddMessage extends AbstractMessage { private static final long serialVersionUID = -940833727168119141L; private int value; public AddMessage() { } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public String toString() { // it is a good practice to create toString() method on message classes. return getSequence() + ":ADD(" + value + ')'; } }
public class ResultMessage extends AbstractMessage {
private static final long serialVersionUID = 7371210248110219946L; private boolean ok; private int value; public ResultMessage() { } public boolean isOk() { return ok; } public void setOk(boolean ok) { this.ok = ok; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public String toString() { if (ok) { return getSequence() + ":RESULT(" + value + ')'; } else { return getSequence() + ":RESULT(ERROR)"; } } }
用户自定义的codec上,我们可以采用:公共包头+不同包体的方式。
- 大小: 8.8 KB
- 描述: SocketTest作为客户端
- 大小: 19.8 KB
分享到:
相关推荐
1. 创建一个`IoConnector`,它是MINA客户端的核心,负责建立到服务器的连接。 2. 同样,定义解码器和编码器,并配置到`IoConnector`。 3. 创建一个`SessionInitializer`,用于初始化新建立的会话。这里可以设置...
解压后,可以通过阅读代码和文档来了解具体实现细节,以便于理解和学习如何在实际项目中运用Mina实现长连接的客户端和服务端。 总的来说,Mina提供了一个强大而灵活的框架,使得开发者能够专注于业务逻辑,而不是...
在Android-Mina-master这个项目中,可能包含了客户端和服务端的代码实现。客户端负责发送数据,而服务端负责接收并处理这些数据。通过实现自定义的IoFilter,可以插入到过滤器链中处理数据的分包和粘包问题。例如,...
本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...
2. 客户端代码:演示如何建立一个MINA客户端,连接到服务端,发送数据并接收回应。 3. 相关配置文件:可能包括服务器端和客户端的配置,如日志配置、线程池设置等。 4. 测试脚本或文档:解释如何运行示例,以及预期...
在"MINA 服务端和客户端demo"中,我们有两个主要的部分:服务端(Server)和客户端(Client)。这两个部分都是基于MINA框架构建的,分别实现了服务器接收客户端连接、处理数据和客户端发起连接、发送数据的功能。 1...
在这个"Mina服务端客户端示例程序"中,我们可能找到了一系列用于展示如何使用Mina框架搭建服务端和客户端的代码示例。下面我们将深入探讨Mina的核心概念以及如何通过这些示例进行学习和实践。 1. **非阻塞I/O**:...
在"mina及时推送客户端服务端实现"的项目中,我们将会探讨如何利用MINA来实现实时推送功能,并保持客户端和服务端的长连接。 1. **实时推送**:实时推送是现代应用中常见的一种需求,如消息通知、直播互动等。MINA...
本案例将深入探讨如何使用Mina作为服务端,结合Socket客户端实现文件的传输。 一、Apache Mina框架介绍 Apache Mina,全称为“Minimalist Application Networking Abstraction”,是一个提供了统一的API来处理多种...
本文将深入探讨如何利用Apache Mina框架在Android平台上实现即时通讯服务端和客户端的构建。Apache Mina是一个网络通信应用框架,它简化了网络编程,使得开发者可以专注于业务逻辑,而不是底层的网络协议实现。 ...
Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...
4. **客户端实现**:MINA客户端使用`NioSocketConnector`来连接服务端。客户端初始化连接器,设置目标服务器地址和端口,然后启动连接。一旦连接成功,客户端也可以创建`Session`对象,通过这个`Session`发送数据给...
这个压缩包中的jar包可能包含了Apache MINA的核心库和其他必要的依赖,如Netty、log4j等,它们是构建和运行MINA TCP服务端所必需的。在实际项目中,开发者需要将这些jar包添加到项目的类路径中,然后按照MINA的API和...
NULL 博文链接:https://bjyzxxds.iteye.com/blog/1267685
在这个"apache mina-spring 服务端程序"项目中,Mina和Spring被整合在一起,创建了一个高效的服务端程序。这样的整合允许开发者利用Spring的强大功能来管理服务端的生命周期,配置网络连接,以及处理业务逻辑。...
5. **mina_test**:这个文件可能是MINA项目的测试代码,包含了服务端和客户端的示例。开发者通常会编写测试代码来验证MINA应用程序的正确性和性能。通过阅读和运行这些测试,我们可以更好地理解MINA的工作原理,以及...
6、在客户端输入服务IP地址和端口,然后点击“开启客户端”按钮。 如果一切正常为,那么你会看到使用Netty框架实现的网络通讯结果。然后你就可以仔细JavaFX代码和Netty的代码,很简单的呢。声明一下,本人使用Mina...
- 服务端:在Mina的处理器中,重写`sessionCreated()`, `messageReceived()`, `messageSent()`等方法,处理客户端连接、接收和发送数据。 - 客户端:通过Socket的输入/输出流读写数据,实现与服务端的通信。 4. *...
本文将详细介绍如何在Android上实现Mina服务端和客户端,以及它们的主要功能。 首先,我们来看服务端(MinaServer)的实现。在服务端,Mina提供了一个Acceptor,它是监听特定端口并处理连接请求的对象。在创建...