MINA2.0用户手册中文版--第二章 第三节 TCP客户端实例

30 篇文章 0 订阅
17 篇文章 0 订阅

之前我们已经看过了客户端的架构,现在我们来研究一个有代表性的客户端实例作为参考实现,即实例sumup client。我们将排除那些可以直接重复照搬的代码,而只关注最重要的组成部分,以下是这个客户端的核心代码:

public static void main(String[] args) throws Throwable {
    NioSocketConnector connector = new NioSocketConnector();
    connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);

    if (USE_CUSTOM_CODEC) {
    connector.getFilterChain().addLast("codec",
        new ProtocolCodecFilter(new SumUpProtocolCodecFactory(false)));
    } else {
        connector.getFilterChain().addLast("codec",
            new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
    }

    connector.getFilterChain().addLast("logger", new LoggingFilter());
    connector.setHandler(new ClientSessionHandler(values));
    IoSession session;

    for (;;) {
        try {
            ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));
            future.awaitUninterruptibly();
            session = future.getSession();
            break;
        } catch (RuntimeIoException e) {
            System.err.println("Failed to connect.");
            e.printStackTrace();
            Thread.sleep(5000);
        }
    }

    // wait until the summation is done
    session.getCloseFuture().awaitUninterruptibly();
    connector.dispose();
}

要创建一个客户端程序,需要完成以下内容:

  • 创建一个连接器
  • 创建一个过滤器链
  • 创建一个IO处理程序IOHandler并添加到连接器中
  • 绑定到需要连接的Server上
接下来,我们来详细的看每一个步骤:
1. 创建一个连接器:
NioSocketConnector connector = new NioSocketConnector();

通过以上代码我们就创建了一个基于NIO的Socket连接器。

2. 创建一个过滤器链:

if (USE_CUSTOM_CODEC) {
    connector.getFilterChain().addLast("codec",
        new ProtocolCodecFilter(new SumUpProtocolCodecFactory(false)));
} else {
    connector.getFilterChain().addLast("codec",
        new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
}

为连接器添加各种过滤器到过滤器链中,此处我们只添加了一个ProtocolCoedc协议编码转换过滤器到过滤器链中。

3. 创建IO处理程序

connector.setHandler(new ClientSessionHandler(values));

此处我们创建了一个ClientSessionHandler 的实例,并设置其为该连接的处理程序。

4. 绑定到服务器

IoSession session;

for (;;) {
    try {
        ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));
        future.awaitUninterruptibly();
        session = future.getSession();
        break;
    } catch (RuntimeIoException e) {
        System.err.println("Failed to connect.");
        e.printStackTrace();
        Thread.sleep(5000);
    }
}

这一块是最重要的部分,进行连接远端的服务器,由于连接本身是异步的,因此我们使用类ConnectFuture,以便获取连接实际建立的时间。一旦连接建立,我们就可以获取一个连接该服务器的IOSession。之后,我们不管发送任何消息到服务器,都要将其写入到该Session中。而所有从服务器返回的响应或消息都会穿过这个过滤器链并最终在IOHandler中被处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值