Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 在GAE通道API中,不调用onmessage_Google App Engine_Webapp2_Channel Api - Fatal编程技术网

Google app engine 在GAE通道API中,不调用onmessage

Google app engine 在GAE通道API中,不调用onmessage,google-app-engine,webapp2,channel-api,Google App Engine,Webapp2,Channel Api,我正在使用python API为GAE构建一个应用程序。这是一个多人游戏。我使用Channel API在玩家之间传递游戏状态 但在应用程序引擎中,不调用通道的onmessage处理程序。调用onopen处理程序。onerror或onclose也不被调用。奇怪的是,这在本地开发服务器上运行得非常好 有没有可能像这样的东西可以在开发服务器上工作,但不能在应用程序引擎本身中工作 如果有人能看看下面对我的应用程序的描述,帮我弄清楚到底发生了什么,我会非常高兴。多谢各位 我调查了很多问题,但我没有犯这些错

我正在使用python API为GAE构建一个应用程序。这是一个多人游戏。我使用Channel API在玩家之间传递游戏状态

但在应用程序引擎中,不调用通道的onmessage处理程序。调用onopen处理程序。onerror或onclose也不被调用。奇怪的是,这在本地开发服务器上运行得非常好

有没有可能像这样的东西可以在开发服务器上工作,但不能在应用程序引擎本身中工作

如果有人能看看下面对我的应用程序的描述,帮我弄清楚到底发生了什么,我会非常高兴。多谢各位

我调查了很多问题,但我没有犯这些错误

<script>

        sendMessage = function(path, opt_param, opt_param2) {

            path += '?g=' + state.game_key;
            if (opt_param) {
                path += '&' + opt_param;
            }
            if (opt_param2) {
                path += '&' + opt_param2;
            }
            var xhr = new XMLHttpRequest();
            xhr.open('POST', path, true);
            xhr.send();
        };
上面是我希望在通道第一次打开时调用的函数。我向'/resp'地址发送邮件

onMessage = function(m) {
    console.log('message received');
    message = JSON.parse(m.data);
    //do stuff with message here 
};
我想在上面的函数中处理从该请求得到的响应

以下是onerror和onclose处理程序

onError = function() {
        console.log('error occured');
        channel = new goog.appengine.Channel('{{ token }}');
        socket = channel.open();
    };

    onClose = function() {
        console.log('channel closed');
    };

    channel = new goog.appengine.Channel('{{ token }}');
    socket = channel.open();
    socket.onopen = onOpened;
    socket.onmessage = onMessage;
    socket.onclose = onClose;
    socket.onerror = onError;

</script>
这在'/resp'请求的请求处理程序中。我的应用程序是一个多人纸牌游戏。我想通知其他玩家一个新玩家已连接。即使是新连接的玩家也会收到此消息

class Responder(webapp2.RequestHandler):            
    def post(self):
        user = users.get_current_user()
        game = OmiGame.get_by_key_name(self.request.get('g'))
        if game.user1:
            channel.send_message(game.user1.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname()))
        if game.user2:
            channel.send_message(game.user2.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname())) 
编辑:user1是创建游戏的用户。我希望通过添加user1的user\u id和相关的users\u id来创建其他玩家的令牌。这里会出问题吗


因此,当我在本地dev服务器上尝试这一点时,我得到的消息非常好。但在GAE上,onMessage不被调用。单击“创建”按钮后,将加载上面脚本的页面,并应显示“playernickname已连接”。

开发服务器和产品上的频道行为有些不同。在dev服务器上,通道客户端只是频繁轮询http请求。在生产环境中,使用comet样式的长轮询

我怀疑在onOpened处理程序中进行XHR调用可能有问题。至少在Chrome中,我看到channel API使用的下一个talkgadget GET请求被取消


尝试在onMessage函数外部调用sendMessage('/resp')。也许可以使用setTimeout将其排队运行,以便在您返回后调用。

非常感谢。使用setTimeout就可以做到这一点。因此,似乎我的名字不太合适onOpen是更好的名字。调用时,通道未准备就绪。
token = channel.create_channel(user.user_id() + game.user1.user_id() )
url = users.create_logout_url(self.request.uri)
template_values = {
                  'token' : token,
                  'id' : pid,
                  'game_key' : str(game.user1.user_id()),
                  'url': url
                 }
path = os.path.join(os.path.dirname(__file__), 'game.html')
self.response.out.write(template.render(path, template_values)) 
class Responder(webapp2.RequestHandler):            
    def post(self):
        user = users.get_current_user()
        game = OmiGame.get_by_key_name(self.request.get('g'))
        if game.user1:
            channel.send_message(game.user1.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname()))
        if game.user2:
            channel.send_message(game.user2.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname()))