要构建一个服务端,你必须选择一个IoAcceptor接口的实现类。
基本上来说,该接口的命名是由于accpet()方法,它主要负责在一个客户端和该服务之间创建连接。然后,服务才能接受来自这些连接的请求。有时,我们会称之为“服务端”接口。
因为我们需要提供处理多种传输协议(TCP/UDP/...),所以我们就提供了多种该接口的实现,我们已经提供了很全面的覆盖,基本上你不需要自己实现一个新的。
我们有很多这种实现类:
- NioSocketAcceptor:非阻塞的基于TCP协议的IoAcceptor实现
- NioDatagramAcceptor:非阻塞基于UDP协议的IoAcceptor实现
- AprSocketAcceptor:阻塞的基于APR之上的TCP协议的IoAcceptor实现
- VmPipeSocketAcceptor:基于虚拟机管道通信的IoAcceptor实现
只需要挑选一个满足你需求的即可
下面是IoAcceptor及其子类和子接口的类图:
首先,你必须选择一个你要实例化的IoAcceptor的类型;其实,在这之前你就已经决定好了,因为它取决于你所要使用的通信协议。让我们通过一个实例看下他的运作:
public TcpServer() throws IOException { // Create a TCP acceptor IoAcceptor acceptor = new NioSocketAcceptor(); // Associate the acceptor to an IoHandler instance (your application) acceptor.setHandler(this); // Bind : this will start the server... acceptor.bind(new InetSocketAddress(PORT)); System.out.println("Server started..."); }
就这样,你就完成了一个TCP服务器的创建过程。如果你想创建一个UDP服务器,只需要更改第一行代码为:
... // Create an UDP acceptor IoAcceptor acceptor = new NioDatagramAcceptor(); ...
停止服务
服务可以通过调用dispose()方法来进行停止,但那必须在所有的挂起的session全部被处理完之后才进行停止操作。
// Stop the service, waiting for the pending sessions to be inactive acceptor.dispose();
当然,你也可以通过传一个布尔类型的变量给该方法,来设置是否在每一个正在执行的线程都完全执行完毕之后才进行停止服务的操作。
// Stop the service, waiting for the processing session to be properly completed acceptor.dispose( true );
服务器状态
可以通过下面方法中的任意一个来获取IoService的状态:
- isActive():如果该服务可以接收传入的请求则返回true
- isDisposing():如果方法dispose()被调用了则返回true,但我们无从知道服务实际是否已经停止(有些session可能还在处理)
- isDisposed():如果方法dispose(boolean)被调用了,且正在执行的线程已经完成执行,则返回true
管理业务处理程序
如果在服务实例化之后,就只需也只能通过调用setHandler(IoHandler)和getHandler()方法,来设置或者获取和该服务关联的IoHandler
如果你想管理过滤器链,你只需调用getFilterChain()方法,如下实例:
// Add a logger filter DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); chain.addLast("logger", new LoggingFilter());
You can also create the chain before and set it into the service :
你也可以通过先创建一个过滤器链,然后再将其设置到服务中来实现,如下:
// Add a logger filter DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); chain.addLast("logger", new LoggingFilter()); // And inject the created chain builder in the service acceptor.setFilterChainBuilder(chain);
相关推荐
IoService既可以作为服务端也可以作为客户端,根据需要,我们会使用IoAcceptor的实现类NioSocketAcceptor来建立服务端。NioSocketAcceptor实际上底层调用的是java.nio.channels.ServerSocketChannel类。如果需要更高...
### Mina2.0完全剖析,完全自学手册 #### Apache Mina 概述 Apache Mina(Multipurpose Infrastructure Networked Applications)是一个强大的网络应用框架,主要用于帮助开发者构建高性能且易于扩展的网络应用程序...
本参考手册关注的是最新版2.0,因此一些1.x特有的功能可能不适用于此版本。学习Mina,你需要具备的基础知识包括JAVA IO、JAVA NIO、JAVA Socket、JAVA线程以及并发库`java.util.concurrent.*`。 Mina的通信结构分为...
Apache Mina是一个高性能的网络应用框架,用于构建可扩展的网络应用,如服务器和...通过阅读Apache Mina Server 2.0中文参考手册,开发者可以深入理解Mina框架的设计理念,并掌握如何使用Mina进行网络应用的开发。
### Apache Mina Server 2.0 中文参考手册知识点概览 #### 一、Mina简介 Apache Mina Server是一款高性能、易于使用的网络通信框架,主要用于构建基于TCP/IP或UDP/IP协议的应用程序。该框架的核心优势在于其能够...
Mina 2.0相比于1.x版本,可能包含了一些新的特性和改进,但文档强调,对于1.x用户,某些功能可能不再适用。学习和使用Mina 2.0需要具备一定的Java基础知识,如IO、NIO、Socket编程以及Java并发库(java.util....
Mina分为1.x和2.x两个主要分支,本参考手册主要介绍的是最新的2.0版本。在使用2.0之前,应确保具备JAVA IO、JAVA NIO、JAVASocket以及JAVA并发库(java.util.concurrent.*)的基础知识。 Mina框架将网络通信的实现...
### Mina2.0学习笔记核心知识点概览 #### 一、Mina入门与环境搭建 ...以上是对《Mina2.0学习笔记(修订版)》的核心知识点概括,希望能帮助读者快速了解Mina框架的关键技术和应用场景,为后续深入学习打下坚实基础。
Mina有两个主要的版本分支:1.x和2.x,本手册将主要介绍2.0版本。 在介绍Mina 2.0之前,需要掌握以下知识点: 1. Java I/O:了解如何在Java中使用I/O流进行数据的输入输出。 2. Java NIO:熟悉Java的新I/O,也就是...
Apache Mina 2.0 是一个强大的网络通信框架,它主要设计用于构建高性能、高度可扩展的网络应用程序。Mina 提供了一种基于事件驱动和异步操作的编程模型,其核心是利用 Java NIO(非阻塞I/O)作为底层支持,这使得它...
在Mina中,服务端通常通过`IoAcceptor`接口来创建,它是监听并接受客户端连接的核心组件。你可以使用`NioSocketAcceptor`或`OioSocketAcceptor`,前者基于非阻塞I/O,后者基于阻塞I/O。服务端的主要任务是定义处理...
在这个"Mina服务端客户端示例程序"中,我们可能找到了一系列用于展示如何使用Mina框架搭建服务端和客户端的代码示例。下面我们将深入探讨Mina的核心概念以及如何通过这些示例进行学习和实践。 1. **非阻塞I/O**:...
IoService接口有两个主要的实现:IoAcceptor用于服务端,IoConnector用于客户端。它们都继承自IoService,扩展了特定的功能。 - **应用** IoService接口的使用通常是通过IoServiceConfig接口配置服务参数,然后...
Mina2.0是其一个重要的版本,提供了许多改进和新特性,使得开发者能够更轻松地处理网络通信任务,尤其是在Java NIO(Non-blocking Input/Output)环境下。 **1. Mina的异步事件驱动模型** Mina的核心设计理念是...
**第三步:服务端程序实现** - **创建 IoAcceptor 对象**:`new NioSocketAcceptor();` - **设置过滤器**:通过 `.getFilterChain().addLast("logger", new LoggingFilter());` 添加日志记录过滤器。 - **绑定端口*...