I/O 服务

  一、简介

  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.IoAcceptororg.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);//设置超时时间

public static void main(String[] args) {
        //创建一个非阻塞的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();
        }
        
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值