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的实例化变量)。