netty ChannelFuture的不解?

bootstrap.connect(...);实现的是与服务器连接,因为连接必然要耗时间,我想为每一个用户在登录的时候都建立一个连接,也就是前边的ChannelFuture对象,并保存在session中,每次用到的时候就getChannel(),这样做是否可行???

但是每次都报我的channel关闭了,这是代码:

    private TimeClientHandler process(CtrlProtocol cp){
        // 操作结果
//        CtrlProtocol result = null;
        
        Channel channel = future.awaitUninterruptibly().getChannel();
        System.out.println(future.toString());
        TimeClientHandler handler = channel.getPipeline().get(TimeClientHandler.class);
        
        handler.process(channel, cp);        
        
        future.awaitUninterruptibly();
        if (!future.isSuccess()) {
            future.getCause().printStackTrace();
        }        
        
        // 等待或监听数据全部完成
        future.getChannel().getCloseFuture().awaitUninterruptibly();

 

public class TimeClientHandler extends SimpleChannelHandler {  
 
    //服务器端返回的执行成功失败标志
    private String returnFlag = null;
    
    //服务器端返回的响应结果对象
    private CtrlProtocol m_ctrlProtocol = null;
    
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        this.m_ctrlProtocol = (CtrlProtocol) e.getMessage();
        this.returnFlag = this.m_ctrlProtocol.GetTypeValue((short) 104);
        e.getChannel().close();
    }

 

我知道这肯定是e.getChannel().close();这个造成的,但是如果我不关闭: future.getChannel().getCloseFuture().awaitUninterruptibly();就会一直在等待,求明白人帮解决下呀!!!谢谢!!


楼上正解,如果你只是为了节省每次通信都反复创建连接的开销,那你可以不必在这个问题上纠缠了,netty内部已经实现。你可以试试看,在同一个周期内,用clientchannel 去连接 server,ctx.getChannel().getId() 都是相同的(ctx是ChannelHandlerContext的实例化变量)。

你可能感兴趣的:(Netty)