【问题标题】:Only one connection to not lose message只有一个连接不会丢失消息
【发布时间】:2012-11-11 23:08:43
【问题描述】:

我有一个带有基本控制器、基本 html 和基本 javascript 文件的应用程序。在这三个中创建一个具有唯一客户端 ID (create_channel) 的令牌,然后我将令牌传递给模板并在 javascript 文件中创建连接。

然后我向这个连接发送一条消息。如果我留在同一页面,它运行良好并且我看到了消息,但是如果我转到其他页面,base.js 会再次加载并启动新连接,所以我永远看不到我从服务器发送的消息。

知道如何解决这个问题吗?我只想创建一个连接,但基础文件加载次数更多...

【问题讨论】:

    标签: javascript python google-app-engine sendmessage channel


    【解决方案1】:

    每个“用户”都必须有一个 ID。我使用会话 ID。然后,仅当它尚不存在时,您才针对它创建令牌。

    channel_token = self.session.get('channel_token')
        if channel_token is None: # if the session user does not have a channel token
            user_id = str(uuid.uuid4()).replace("-",'')
            channel_token = channel.create_channel(user_id)
            self.session['channel_token'] = channel_token
            self.session['user_id'] = user_id
    

    因此,当您转到其他页面时,如果该 user_Id 已经有可用的频道,则不会创建新频道。当用户导航离开时,您每次都会断开/连接。您可以使用user_id 发送消息,无论他们在哪个页面上。

    【讨论】:

    • 这解决了我的令牌问题,但是当加载基本 javascript 文件时,会创建其他连接,使用相同的令牌但其他连接,所以消息丢失了,因为我输入了 $(function() { var token = $('#token').val(); channel = new goog.appengine.Channel(token); socket = channel.open(); 知道吗?我可以把它放在哪里?
    • 我不太清楚你的意思,但是这是我写的一个演示,也许它有用:github.com/Paul1234321/channelapidemo你可以看到它在这里运行(暂时)pppredictor.appspot.com跨度>
    • 好例子!我的“问题”是我有你在
    • 啊,我明白了。我还没有遇到过这个问题。有一种方法可以判断连接是否存在,当它创建时,客户端将向 _ah/channel/connected/ 进行 POST,详细信息如下:developers.google.com/appengine/docs/python/channel/… 所以我猜你可以跟踪谁已连接并且不允许 .js如果已经存在,则为该特定用户创建另一个连接。
    猜你喜欢
    • 2014-02-28
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2016-09-15
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多