jjzjj

android - AppRTC 服务器返回 html 而不是 Json

coder 2023-11-26 原文

我正在 Android 中原生实现 WebRTC。我能够按照此处描述的方式编译和运行代码 http://www.webrtc.org/native-code/android ,但我遇到了一个问题,apprtc.appspot.com 显然没有按预期返回 channel token :

01-05 20:01:51.230  15488-15488/org.appspot.apprtc E/AppRTCDemoActivity﹕ Fatal error: Missing channelToken in HTML: <!DOCTYPE html>
    <!--
    *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
    *
    *  Use of this source code is governed by a BSD-style license
    *  that can be found in the LICENSE file in the root of the source
    *  tree.
    -->
    <html>
    <head>
    <title>WebRTC Reference App</title>
    <meta charset="utf-8">
    <meta name="description" content="WebRTC reference app">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
    <script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script><link rel="canonical" href="https://apprtc.appspot.com/room/42272483?r=fh">
    <link rel="stylesheet" href="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/css/A.main.css.pagespeed.cf.mluzaRyZGPUUQu3CIFwW.css">
    </head>
    <body><noscript><meta HTTP-EQUIV="refresh" content="0;url='https://apprtc.appspot.com/r/42272483?r=fh&amp;PageSpeed=noscript'" /><style><!--table,div,span,font,p{display:none} --></style><div style="display:block">Please click <a href="https://apprtc.appspot.com/r/42272483?r=fh&amp;PageSpeed=noscript">here</a> if you are not redirected within a few seconds.</div></noscript>
    <div id="videos">
    <video id="mini-video" autoplay muted></video>
    <canvas id="remote-canvas"></canvas>
    <video id="remote-video" autoplay></video>
    <video id="local-video" autoplay muted></video>
    </div>
    <footer>
    <div id="sharing">
    <div id="room-link">Waiting for someone to join this room: <a href="https://apprtc.appspot.com/room/42272483?r=fh" target="_blank">https://apprtc.appspot.com/room/42272483?r=fh</a></div>
    </div>
    <div id="info"></div>
    <div id="status"></div>
    </footer>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/stats.js.pagespeed.jm.A-w15PL7V0sRNC026ANH.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/signaling.js.pagespeed.jm.QZ7VRUXKfNhiyV7jHkmW.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/infobox.js.pagespeed.jm.C9t_78UyYtO6bMRljt_L.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/sdputils.js.pagespeed.jm.DWy54ENwSOTLQKw10p1o.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/util.js.pagespeed.jm.q3iuB_S1TC2eBJC_RFlb.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/main.js.pagespeed.jm.mR4sH1O_ReNLDaNiS3o_.js"></script>
    <script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/adapter.js.pagespeed.jm.-Ip1bBjviqtsxeGluAGS.js"></script>
    <script type="text/javascript">var params={errorMessages:[],isLoopback:false,roomId:'42272483',roomLink:'https://apprtc.appspot.com/room/42272483?r=fh',mediaConstraints:{"audio":true,"video":true},offerConstraints:{"optional":[],"mandatory":{}},peerConnectionConfig:{"iceServers":[]},peerConnectionConstraints:{"optional":[{"googImprovedWifiBwe":true}]},turnRequestUrl:'https://computeengineondemand.appspot.com/turn?username=280585048&key=4080218913',turnTransports:'',audioSendBitrate:'',audioSendCodec:'',audioRecvBitrate:'',audioRecvCodec:'',isStereoscopic:'',opusMaxPbr:'',opusFec:'',opusStereo:'',videoSendBitrate:'',videoSendInitialBitrate:'',videoSendCodec:'',videoRecvBitrate:'',videoRecvCodec:'',wssUrl:'wss://apprtc-ws.webrtc.org:443/ws',wssPostUrl:'https://apprtc-ws.webrtc.org:443'};initialize();</script>
    <script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.cr

在此处检查 AppRTCClient.java 的源代码时 https://code.google.com/p/webrtc/source/browse/trunk/talk/examples/android/src/org/appspot/apprtc/AppRTCClient.java?r=5847我在第 234ff 行发现了一个有趣的评论,正是应用程序失败的功能:

// Fetches |url| and fishes the signaling parameters out of the HTML via
// regular expressions.
//
// TODO(fischman): replace this hackery with a dedicated JSON-serving URL in
// apprtc so that this isn't necessary (here and in other future apps that
// want to interop with apprtc).
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
        throws IOException {

    // ...

}

在函数中发生了很多 html 代码的解析,似乎 channel token 没有从服务器返回的响应 html 中正确解析(难怪)。

我没有进一步调查 channel token 是否存在和/或它是否正确。相反,我怀疑代码(主干!)可能已经过时,用谷歌搜索并在 Github 上找到了这个项目:https://github.com/pristineio/webrtc-android

相同的函数,在第 232ff 行,将 &t=json 作为参数传入,据说是因为它希望服务器返回 Json。然后函数在解析 Json 时失败,猜猜为什么。答对了!因为不管有无参数,返回的都是同一个html页面。

// Fetches |url| and fishes the signaling parameters out of the JSON.
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
        throws IOException, JSONException {
    url = url + "&t=json";

    // ...

}

为了完整起见,失败的完整 URL:

https://apprtc.appspot.com/?r=00000000&t=json

其中 00000000 是房间号。

所以谷歌的Fischman先生似乎同时更新了代码,但是webrtc的代码不是最新的,Github的pristineio/webrtc-android似乎知道曾经让apprtc.appspot.com返回的参数Json 而不是 html,但它不再这样做了。

我用谷歌搜索但找不到 apprtc.appspot.com 的服务器代码,但我记得以前见过它(我相信它是一个 Python 项目)。

  • 有人有那个源代码的链接吗?

然后我搜索了该 URL 的参数,我找到了两个列出这些参数的页面,包括 http://samdutton.github.io/webrtc/samples/web/content/apprtc/params.html , 但它们都没有显示参数或替代 URL 来请求 Json 的结果。

  • 有人知道正确的参数(或 url)是什么吗?
  • 或者有人知道完整的规范是什么吗?
  • 或者有人有指向 AppRTCClient.Java 最新和可用源代码的链接吗?

谢谢!

最佳答案

遇到了和你一样的问题。我在这里找到了代码:

https://github.com/GoogleChrome/webrtc/tree/master/samples/web/content/apprtc

目前正在查看更改以查看可能破坏它的内容。如果我发现了什么,我会更新这个答案。

更新:看起来他们在此提交中做了一些重大更改:

https://github.com/GoogleChrome/webrtc/commit/c36b88475fab8a3e4436a87a7ea84265b0e13a8a#diff-c3e41e94913c93dfe31babd4830c3065

他们正在从 GAE Channel api 转移到 websocket channel 。

关于android - AppRTC 服务器返回 html 而不是 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27792233/

有关android - AppRTC 服务器返回 html 而不是 Json的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  5. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  6. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  7. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  10. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

随机推荐