3

JavaとAndroidの初心者の多くと同じように、私はWindowsでgcmデモサーバーとgcmデモクライアントを実行しようとしています。Eclipseを使用して垂直デバイスとTomcatをWebサーバーとして実行しています。

デバイスの登録と登録解除に問題はありませんが、メッセージを送信しようとするとエラー401が発生しました。同様の質問について多くの回答を読んでも、私が間違っていることの手がかりはありません。チュートリアルに記載されている場所に、apyキー、サーバーURL、送信者IDを配置しました。また、SendAllMessagesServlet.javaのコードを少し変更しました。

// Processes the request to add a new message.  
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException {
    List<String> devices = Datastore.getDevices();
    String status;
    if (devices.isEmpty()) {
        status = "Message ignored as there is no device registered!";
    } else {
        // NOTE: check below is for demonstration purposes; a real application
        // could always send a multicast, even for just one recipient
        // MY CODE
        String collapseKey = "mycollapsekey";
        String userMessage = "testmessage";
        // END OF MY CODE
        if (devices.size() == 1) {
            // send a single message using plain post
            String registrationId = devices.get(0);
            //  Message message = new Message.Builder().build();
            //  BELOW I HAVE CHANGED MESSAGE BUILDING A BIT:
            Message message = new Message.Builder()
                .collapseKey(collapseKey)
                .timeToLive(30)
                .delayWhileIdle(true)
                .addData("message", userMessage)
                .build();
            Result result = sender.send(message, registrationId, 5);
            status = "Sent message to one device: " + result;
        } else {
            // send a multicast message using JSON
            // must split in chunks of 1000 devices (GCM limit)
            int total = devices.size();
            List<String> partialDevices = new ArrayList<String>(total);
            int counter = 0;
            int tasks = 0;
            for (String device : devices) {
                counter++;
                partialDevices.add(device);
                int partialSize = partialDevices.size();
                if (partialSize == MULTICAST_SIZE || counter == total) {
                    asyncSend(partialDevices);
                    partialDevices.clear();
                    tasks++;
                }
            }
            status = "Asynchronously sending " + tasks + " multicast messages to " + total + " devices";
        }
    }
    req.setAttribute(HomeServlet.ATTRIBUTE_STATUS, status.toString());
    getServletContext().getRequestDispatcher("/home").forward(req, resp);
}

しかし、メッセージを送信するときに次のエラーが発生します。これが私のtomcatlocalhostログファイルです。

окт 22, 2012 1:06:39 PM org.apache.catalina.core.ApplicationContext log
INFO: org.apache.webapp.balancer.BalancerFilter: init(): ruleChain: [org.apache.webapp.balancer.RuleChain: [org.apache.webapp.balancer.rules.URLStringMatchRule: Target string: News / Redirect URL: http://www.cnn.com], [org.apache.webapp.balancer.rules.RequestParameterRule: Target param name: paramName / Target param value: paramValue / Redirect URL: http://www.yahoo.com], [org.apache.webapp.balancer.rules.AcceptEverythingRule: Redirect URL: http://jakarta.apache.org]]
окт 22, 2012 1:06:39 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
окт 22, 2012 1:06:39 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
окт 22, 2012 1:06:39 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
окт 22, 2012 1:06:39 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
окт 22, 2012 1:07:05 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet SendAllMessagesServlet threw exception
com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 401
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:177)
    at com.google.android.gcm.server.Sender.send(Sender.java:121)
    at com.google.android.gcm.demo.server.SendAllMessagesServlet.doPost(SendAllMessagesServlet.java:93)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:881)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:674)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:541)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Unknown Source)

Stderrログ:

2012-10-22 13:06:37 Commons Daemon procrun stderr initialized
окт 22, 2012 1:06:38 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Apache Software Foundation\Tomcat 5.5\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Android\android-sdk\tools;C:\Program Files\Android\android-sdk\platform-tools;c:\ant\bin;C:\Program Files\Java\jdk1.7.0_07\lib;;.
окт 22, 2012 1:06:38 PM org.apache.coyote.http11.Http11BaseProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
окт 22, 2012 1:06:38 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 531 ms
окт 22, 2012 1:06:38 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
окт 22, 2012 1:06:38 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.36
окт 22, 2012 1:06:38 PM org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
окт 22, 2012 1:06:39 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive gcm-demo.war
окт 22, 2012 1:06:39 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized
INFO: Reading /api.key from resources (probably from WEB-INF/classes
окт 22, 2012 1:06:39 PM org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
окт 22, 2012 1:06:39 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
окт 22, 2012 1:06:39 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/32  config=null
окт 22, 2012 1:06:39 PM org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
окт 22, 2012 1:06:39 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1219 ms
окт 22, 2012 1:06:58 PM com.google.android.gcm.demo.server.Datastore register
INFO: Registering APA91bF0kArKvvJsHu4qS92FQl-CLKt0CJL8_SrtyL9OkGSqQQUMywMvPhulG4xmdiX_uVhdXs6xERY5pwQzHES-aI-tBCOgMZ_JOBT8S_RIK9XhyQDf49Yfr9g4nSnfgN2GIJHlnqTA4mAJBolnjfuQKLmULl0g5g

私が見逃したこと、またはそのような問題解決についてもっと読む場所はどこですか?

4

4 に答える 4

2

/ gcm-demo/sendAllにアクセスするという同様の質問に答えました。理由:HTTPステータスコード:401

使用している送信者APIキーを確認してください。

于 2012-10-22T11:22:06.573 に答える
1

私もこのエラーが発生していました、

ここに画像の説明を入力してください

有効にしていないことがわかりましGoogle Cloud Messaging for Androidた。(私のマシンの1つでは、同じ手順を実行しているときにこれが自動的に有効になりました。他のマシンでも同じことが行われなかった理由はわかりません)簡単に言うと、開発者コンソールに移動して有効にします。

APIs and Auths | APIs | Google Cloud Messaging for Android

ブラウザを更新して、再試行してください。

于 2015-02-27T15:46:22.230 に答える
1

この問題は、複数の原因があるため、どのフォーラムでもうまく対処されていない可能性があります。私の場合は次のとおりです。GCMプッシュ通知のデモを行っていましたが、初めて機能しました。しかし、翌日同じコードを使用して進むと、回答に例外が記載されていることがわかりました。観察したところ、静的ではないため、パブリックIPが変更されていることに気付きました。このIPは、GoogleDevelopersConsoleでプロジェクトを作成するときに提供する必要があります。あなたはグーグルで「私のパブリックIPアドレス」を検索することによってあなたのパブリックIPを見つけることができます。または、デモの目的で、IPを0.0.0.0/0として使用することを強くお勧めします。これは推奨されており、プロジェクトをデプロイするとき、サーバーのIPは静的になります。その後、0.0.0.0 /0IPをサーバーIPに置き換えることができます。また、「プロジェクト番号」や「サーバーAPIキー」などのすべてのキーを確認してください。それが役に立てば幸い。乾杯 :)

于 2016-01-28T08:30:44.717 に答える
0

Commons Daemonprocrunstderrが初期化されました

上記のエラーが発生した場合は、jvm.dllパスのデフォルトパスが* C:\ Program Files \ Java \ jdk1.6.0_37 \ jre \ bin \ client \jvm.dll*であることを確認してください。正しいパスに変更してください。

于 2012-11-12T12:35:24.727 に答える