【MinaFile】【四】编写Mina客户端和处理类

一、客户端Client

public class Client {
    private static final String HOSTNAME = "localhost";

    private static final int PORT = 8080;

    private static final long CONNECT_TIMEOUT = 30*1000L;

    private static final boolean USE_CUSTOM_CODEC = true;

    public static void main(String[] args) throws Throwable {
       
        int[] values = new int[50];
        for(int i = 0;i< 50;++i){
        	values[i] = i;
        }
        
       
        NioSocketConnector connector = new NioSocketConnector();

       
        connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
        if (USE_CUSTOM_CODEC) {
            connector.getFilterChain().addLast(
                    "codec",
                    new ProtocolCodecFilter(
                            new UploadFileProtocolCodecFactory(false)));
        } else {
            connector.getFilterChain().addLast(
                    "codec",
                    new ProtocolCodecFilter(
                            new ObjectSerializationCodecFactory()));
        }
        connector.getFilterChain().addLast("logger", new LoggingFilter());

        connector.setHandler(new FileUploadClientHandler(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);
            }
        }

        session.getCloseFuture().awaitUninterruptibly();
        
        connector.dispose();
    }
}
二、客户端处理类 FileUploadClientHandler

public class FileUploadClientHandler extends IoHandlerAdapter {

    private final static Logger LOGGER = LoggerFactory.getLogger(FileUploadClientHandler.class);
    
    private final int[] values;

    private boolean finished;

    public FileUploadClientHandler(int[] values) {
        this.values = values;
    }

    public boolean isFinished() {
        return finished;
    }

    @Override
    public void sessionOpened(IoSession session) {
         
        for (int i = 0; i < values.length; i++) {
            Message m = new Message();
            m.setSequence(i);
            m.setValue(values[i]);
            session.write(m);
        }
    }

    @Override
    public void messageReceived(IoSession session, Object message) {
    	// 接收服务器的消息。强转。
        ResultMessage rm = (ResultMessage) message;
        if (rm.isOk()) {
            // 服务器返回true
        	// 如果返回的Sequence是最后一个,那么就关闭连接。
            if (rm.getSequence() == values.length - 1) {
                // 打印值并关闭连接
                LOGGER.info("客户端收到服务器的值: " + rm.getValue());
                session.close(true);
                finished = true;
            }
        } else {
            LOGGER.warn("服务器停止, 断开连接...");
            session.close(true);
            finished = true;
        }
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) {
        session.close(true);
    }
}

三、可以试一下效果了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值