一、简介
I/O 服务用来执行真正的 I/O 操作,以及管理I/O 会话。根据所使用的数据传输方式的不同,有不同的I/O 服务的实现。
I/O 服务执行的是输入和输出两种操作,实际上有两种具体的子类型。一种称为“I/O 接受器(I/O acceptor)”,用来接受连接,一般用在服务器的实现中;另外一种称为“I/O 连接器(I/O connector)”,用来发起连接,一般用在客户端的实现中。
对应在Apache MINA 中的实现,org.apache.mina.core.service.IoService是 I/O 服务的接口,而继承自它的接口org.apache.mina.core.service.IoAcceptor和org.apache.mina.core.service.IoConnector则分别表示 I/O 接受器和 I/O 连接器。
IoService接口提供的重要方法如下表所示。
setHandler(IoHandler handler) | 设置 I/O 处理器。该 I/O 处理器会负责处理该 I/O 服务所管理的所有 I/O 会话产生的 I/O 事件。 |
getFilterChain() | 获取 I/O 过滤器链,可以对 I/O 过滤器进行管理,包括添加和删除 I/O 过滤器。 |
getManagedSessions() | 获取该 I/O 服务所管理的 I/O 会话。 |
1. I/O 接受器
I/O 接受器用来接受连接,与对等体(客户端)进行通讯,并发出相应的 I/O 事件交给 I/O 处理器来处理。使用 I/O 接受器的时候,只需要调用bind方法并指定要监听的套接字地址。当不再接受连接的时候,调用unbind停止监听即可。
2. I/O 连接器
I/O 连接器用来发起连接,与对等体(服务器)进行通讯,并发出相应的 I/O 事件交给 I/O 处理器来处理。使用 I/O 连接器的时候,只需要调用connect方法连接指定的套接字地址。另外可以通过setConnectTimeoutMillis设置连接超时时间(毫秒数)。
I/O 连接器示例
SocketConnector connector = new NioSocketConnector(); //创建一个非阻塞的server端的 socket NIO connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);//设置超时时间 |
//创建一个非阻塞的server端的 socket NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();//默认的过滤器链
//设定一个过滤器,一行一行的读取数据(/r/h)
chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
// 协议解析,采用mina现成的UTF-8字符串处理方式
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
// 设置消息处理类(创建、关闭Session,可读可写等等,继承自接口IoHandler)
acceptor.setHandler(new MinaServerHandler());
// 设置接收缓存区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//设定一个服务器端的端口号
int port = 9090;
//绑定端口,启动服务器(不会阻塞,立即返回)。服务器监听
try {
acceptor.bind(new InetSocketAddress(port));
System.out.println("我的端口号"+port);
} catch (IOException e) {
e.printStackTrace();
}
}