要构建一个服务端,你必须选择一个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);