GCM演示服务器发送消息到设备引发401错误

至于许多其他新手到Java和安卓我试图运行gcm演示服务器和gcm演示客户端在Windows上,使用eclipse运行垂直设备和tomcat作为webserer。

我没有注册和rerestering设备的问题,但我试图发送消息时出现错误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); } 

但是在发送消息时我还是得到了下一个错误,这里是我的tomcat localhost日志文件:

 окт 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 

我错过了什么或在哪里阅读更多的解决这些问题?

Solutions Collecting From Web of "GCM演示服务器发送消息到设备引发401错误"

我刚刚回答了一个类似的问题 – 访问/ gcm-demo / sendAll。 原因:HTTP状态码:401

检查您正在使用的发件人API密钥。

我也有这个错误,

在这里输入图像说明

事实证明,我还没有启用Google Cloud Messaging for Android 。 (在我的一台机器上,这是自动启用,同时遵循相同的步骤,不知道为什么它没有做同样的)长话短说,去开发者控制台,并启用它。

APIs and Auths | APIs | Google Cloud Messaging for Android

刷新浏览器并重试。

这个问题在任何一个论坛都没有得到很好的解决,因为它有多种原因。 我的情况是:我正在做一个GCM推送通知的演示,它是第一次。 但是,当我第二天用相同的代码进行时,我在答案中发现了异常。 在观察中,我注意到我的公有IP已经变了,因为它不是静态的。 在Google开发者控制台上创建项目时,必须提供此IP。 你可以通过在谷歌搜索“我的公共IP地址”找到你的公共IP。 或者为了演示的目的,我现在强烈建议你使用IP作为建议的0.0.0.0/0,当你部署你的项目时,你的服务器IP将是静态的。 然后,您可以用您的服务器IP替换0.0.0.0/0 IP。 此外,检查所有的键,如“项目号码”和“服务器API密钥”。 希望能帮助到你。 CHEERS 🙂

Commons Daemon procrun stderr初始化

如果有任何人得到上述错误,请尝试检查位于* C:\ Program Files \ Java \ jdk1.6.0_37 \ jre \ bin \ client \ jvm.dll *的jvm.dll路径默认路径。将其更改为正确的路径。