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();
                }
            }
        });
    }
时间: 2024-09-29 01:14:31

Jetserver开源项目学习(七)—— ChannelFutureListener的用法的相关文章

Jetserver开源项目学习(八)—— 解码编码器的用法

一.EventEncoder和EventDecoder 事件编码器会收到一个事件对象(event object)并将它转换成为ChannelBuffer对象.编码器首先读取事件的类型并作为操作码(缓冲区的第一个字节),然后读取事件体并转换成为ChannelBuffer对象作为信息体. /** * A simple event encoder will receive an incoming event, and convert it to a * {@link ChannelBuffer}. I

转:从开源项目学习 C 语言基本的编码规则

从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项目中的每个开发者使用他自己的风格. 所有代码都保持一致风格的大型库,更容易让人理解. 有许多资源是关于能让人采取的更好的编码规则的,我们可以通过以下方式学到好的编码规则: 阅读书或杂志 浏览网站 与同事交流 参加培训 另一个更有趣的方法是通过研究一个成熟的知名开源项目来得知其开发者是怎样编写代码的.

说出你最喜欢的开源项目,七牛和你一起去支持!

为进一步支持开源事业,七牛推出了"七牛开源项目扶持计划",免费支持开源项目,为开源事业尽一份力量. 如果您建有开源项目站,或者参与了其他开源项目站的维护,您就可以申请加入"七牛开源项目扶持计划". 申请步骤如下: 同时,我们特别推出了"说出你最喜欢的开源项目,七牛和你一起去支持!"活动,只要是你喜欢的开源项目,七牛就会和你一起去支持!我们还会在每个月的第一个星期一从参与该活动的开发者中随机抽取3个幸运开发者,各送出七牛周边礼品1份. 了解计划与活

android开源项目学习

FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:http://www.fbreader.org/FBReaderJ/ Angle Angle是一款专为Android平台设计的,适合快速开发的2D游戏引擎,基于OpenGL ES技术开发.该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现. 项目地址:http://code.google

ASP.NET MVC 开源项目学习之ProDinner (二)

下面我们来看第二层:Data   这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Dinner>().HasMany(r => r.Meals).WithMany(o => o.Dinner

Jetsever开源项目学习(二)架构学习—— Jetserver internal details and how it works.

Jet Server - architecture and internal details This section outlines how data flows through jet server, the important classes and interfaces and also which ones need to be extended by users to write their game logic, receive events and so on. If you

NumberProgressBar开源项目学习

1.概述 多看多学涨姿势, github真是个宝库 这个项目主要是实现数字进度条效果 github地址在https://github.com/daimajia/NumberProgressBar 感谢开源作者! 梳理主要知识点: [1]熟悉自定义view的流程 [2]实现原理 [3]android中的view坐标系使用 [4]onMeasure优雅的方法书写 [5]canvas中drawText方法注意点 [6]代码的可读性非常强 2.项目要点分析 [熟悉自定义view的流程] 自定义view需

ASP.NET MVC 开源项目学习之ProDinner (一)

首先在github上面将ProDinner项目通过 Git Bash 克隆到本地,接下来我们开始分析这个项目吧~ 系统采用.Net 4.5, Asp.net Mvc 5,VS2012,Sql server,系统的整体设计非常轻量级,却做到了整体架构分层明显,模块耦合度低的架构思想,很适合新手学习. Core层实现了本地化Model和EF模型化需要的model数据,另外,Core层还为低耦合的业务逻辑和低耦合的数据访问做好了接口准备. 1.Model: 以下是表关系的大致内容: 我们在分析数据库表

Jetsever开源项目学习(三)Session学习

package org.menacheri.jetserver.app; import java.util.List; import org.menacheri.jetserver.communication.MessageSender; import org.menacheri.jetserver.communication.MessageSender.Fast; import org.menacheri.jetserver.communication.MessageSender.Reliab