Jetserver开源项目学习(七)—— ChannelFutureListener的用法
用法一:给通道添加异步接口
public void close() { LOG.debug("Going to close tcp connection in class: {}", this .getClass().getName()); Event event = Events.event(null, Events.DISCONNECT); if (channel.isConnected()) { channel.write(event).addListener(ChannelFutureListener.CLOSE); } else { channel.close(); LOG.trace("Unable to write the Event {} with type {} to socket", event, event.getType()); } }
用法二:Future类添加监听接口
public void handleGameRoomJoin(Player player, Channel channel, String refKey) { GameRoom gameRoom = lookupService.gameRoomLookup(refKey); if (null != gameRoom) { PlayerSession playerSession = gameRoom.createPlayerSession(player); gameRoom.onLogin(playerSession); String reconnectKey = (String)idGeneratorService .generateFor(playerSession.getClass()); playerSession.setAttribute(JetConfig.RECONNECT_KEY, reconnectKey); playerSession.setAttribute(JetConfig.RECONNECT_REGISTRY, reconnectRegistry); LOG.trace("Sending GAME_ROOM_JOIN_SUCCESS to channel {}", channel.getId()); ChannelFuture future = channel.write(eventToFrame( Events.GAME_ROOM_JOIN_SUCCESS, reconnectKey)); connectToGameRoom(gameRoom, playerSession, future); } else { // Write failure and close channel. ChannelFuture future = channel.write(eventToFrame( Events.GAME_ROOM_JOIN_FAILURE, null)); future.addListener(ChannelFutureListener.CLOSE); LOG.error( "Invalid ref key provided by client: {}. Channel {} will be closed", refKey, channel.getId()); } }
public void connectToGameRoom(final GameRoom gameRoom, final PlayerSession playerSession, ChannelFuture future) { future.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { Channel channel = future.getChannel(); LOG.trace( "Sending GAME_ROOM_JOIN_SUCCESS to channel {} completed", channel.getId()); if (future.isSuccess()) { // Set the tcp channel on the session. NettyTCPMessageSender sender = new NettyTCPMessageSender( channel); playerSession.setTcpSender(sender); // Connect the pipeline to the game room. gameRoom.connectSession(playerSession); // Send the connect event so that it will in turn send the // START event. playerSession.onEvent(Events.connectEvent(sender)); } else { LOG.error("Sending GAME_ROOM_JOIN_SUCCESS message to client was failure, channel will be closed"); channel.close(); } } }); }
文章来自:http://www.cnblogs.com/Guoyutian/p/5121780.html