日期:2014-05-20  浏览次数:20715 次

关于Netty4怎么实现服务发送数据之后等待返回结果,谢谢!!急急
final ChannelFuture f = channel.writeAndFlush("to client:"+channel.remoteAddress().toString()+"---------"+msg);// (3) 
     f.addListener(new ChannelFutureListener() {
            public void operationComplete(ChannelFuture future) {
                // 写入完成等待数据?本来这里是有个wait的。。。。
                // 
//读取数据,这里应该这么实现??????????好像下面的不能这么实现
             final Channel c = future.channel().read();
             ChannelFuture readFuture = c.close();
             readFuture.addListener(new ChannelFutureListener(){
             @Override
             public void operationComplete(ChannelFuture _readFuture) {
              
            
             }
            
             });
            
            
            
            }
        });

------解决方案--------------------
如果要确定包是一致性的,就用MD5做数据校验。
  public void operationComplete(ChannelFuture future) {
  }
这个地方是表示数据已经发送完毕。可以记录一些其他事情,比如日志。
发送完毕后,有新数据响应仍然走 Handler原来的流程。在这里面应该无法读取到响应数据。


(如果服务器同时向多个客户端,连续发送多条指令,每个不同的指令返回的数据不同,那么怎么确定该包为某一指令发出得到的数据) 
这个地方 如果是多个客户端,那么每个客户端的ID是唯一的,netty里面有唯一ID号标示请求的唯一性。
还有一种方法是 发送请求时带一个唯一ID号,响应数据时也是带一个唯一ID号,这个唯一ID号就能确保客户端与服务器端的包是否一致性问题。
------解决方案--------------------
Netty用的是NIO,是异步的,即你发送消息给Server后就不用等了,一边玩会去(传统的Socket是一直阻塞在这里等Server消息来,消息不到就一直等)。
等会Server发消息过来后会通知你消息到了,然后你再处理消息。