正如java和android的许多其他新手一样,我试图在Windows上运行gcm演示服务器和gcm演示客户端,使用eclipse运行vertual设备和tomcat作为webserer。
我在注册和取消设备时没有问题,但在尝试发送消息时出现错误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
我错过了什么或在哪里阅读更多关于解决这些问题的内容?
答案 0 :(得分:2)
我刚刚回答了类似的问题 - accessing /gcm-demo/sendAll. Reason: HTTP Status Code: 401
检查您正在使用的发件人API密钥。
答案 1 :(得分:1)
我也遇到了这个错误,
结果我没有启用Google Cloud Messaging for Android
。 (在我的一台机器上,这是在执行相同步骤时自动启用的,不知道为什么它在另一台机器上没有执行相同的操作)长话短说,请转到开发人员控制台并启用它。
APIs and Auths | APIs | Google Cloud Messaging for Android
刷新浏览器并重试。
答案 2 :(得分:1)
这个问题在任何论坛上都没有得到很好的解决,因为它有多种原因。 我的情况是:我正在做一个GCM推送通知的演示,它第一次工作。但随着我的继续前进 第二天用相同的代码我在答案中找到了例外。观察时,我注意到了我的公众 IP已发生变化,因为它不是静态的。在Google开发人员上创建项目时,必须提供此IP 安慰。您可以通过在Google中搜索“我的公共IP地址”来找到您的公共IP。或者用于演示目的i 现在强烈建议您使用IP作为0.0.0.0/0,建议在部署项目时使用 您的服务器IP将是静态的。然后,您可以将0.0.0.0/0 IP替换为您的服务器IP。 另外,检查“项目编号”和“服务器API密钥”等所有密钥。 希望能帮助到你。 CHEERS:)
答案 3 :(得分:0)
Commons Daemon procrun stderr initialized
如果有任何人遇到上述错误,请尝试检查您的jvm.dll路径默认路径是否为* C:\ Program Files \ Java \ jdk1.6.0_37 \ jre \ bin \ client \ jvm.dll *将其更改为正确的道路。