只有一个连接不会丢失消息
Posted
技术标签:
【中文标题】只有一个连接不会丢失消息【英文标题】:Only one connection to not lose message 【发布时间】:2012-11-11 23:08:43 【问题描述】:我有一个带有基本控制器、基本 html 和基本 javascript 文件的应用程序。在这三个中创建一个具有唯一客户端 ID (create_channel) 的令牌,然后我将令牌传递给模板并在 javascript 文件中创建连接。
然后我向这个连接发送一条消息。如果我留在同一页面,它运行良好并且我看到了消息,但是如果我转到其他页面,base.js 会再次加载并启动新连接,所以我永远看不到我从服务器发送的消息。
知道如何解决这个问题吗?我只想创建一个连接,但基础文件加载次数更多...
【问题讨论】:
【参考方案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如果已经存在,则为该特定用户创建另一个连接。以上是关于只有一个连接不会丢失消息的主要内容,如果未能解决你的问题,请参考以下文章