GCM演示服务器向设备发送消息提示401错误 [英] GCM demo server sending message to device raises 401 error

查看:95
本文介绍了GCM演示服务器向设备发送消息提示401错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

与其他许多java和android的新手一样,我试图在Windows上运行gcm演示服务器和gcm演示客户端,使用eclipse作为weberer来运行虚拟设备和tomcat。



我没有注册和拒绝设备的问题,但是当尝试发送消息时我收到错误401。阅读很多关于类似问题的答案,但仍然没有线索我做错了什么。我把apy key,server url和sender id放在教程中提到的地方。还要更改SendAllMessagesServlet.java中的代码:

  //处理添加新消息的请求。 
@Override protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws IOException,ServletException {
列表< String> devices = Datastore.getDevices();
字符串状态;
if(devices.isEmpty()){
status =消息被忽略,因为没有设备注册!
} else {
//注:检查以下是为了演示目的;一个真正的应用程序
//可以总是发送多播,即使只有一个收件人
//我的代码
String collapseKey =mycollapsekey;
String userMessage =testmessage;
// END OF MY CODE
if(devices.size()== 1){
//发送单个消息使用简单的文章
String registrationId = devices.get( 0);
// Message message = new Message.Builder()。build();
//以下我有更改的消息建立BIT:
消息消息=新Message.Builder()
.collapseKey(collapseKey)
.timeToLive(30)
.delayWhileIdle(true)
.addData(message,userMessage)
.build();
结果result = sender.send(message,registrationId,5);
status =向一个设备发送消息:+ result;
} else {
//发送使用JSON
的多播消息//必须以1000个设备的大小分组(GCM限制)
int total = devices.size();
列表< 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();
任务++;
}
}
status =异步发送+任务+多播消息到+ total +设备;
}
}
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:目标参数名称: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或g.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调用
SEVERE:Servlet.service()servlet SendAllMessagesServlet抛出异常
com.google.android.gcm.server.InvalidRequestException:HTTP状态码:401
com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:177)
在com.google .android.gcm.server.Sender.send(Sender.java:121)
在com.google.android.gcm.demo.server.SendAllMessagesServlet.doPost(SendAllMessagesServlet.java:93)
在javax在.servlet.http.HttpServlet.service .internalDoFilter(ApplicationFilterChain.java:269)
在o rg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
在org.apache。 catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
在org.apache.catalina.valves。 ErrorReportValve.invoke(ErrorReportValve.java:117)
在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
在org.apache.catalina.connector.CoyoteAdapter.service( CoyoteAdapter.java:174)
在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:881)
在org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection(Http11BaseProtocol。 java:674)
在org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:541)
在org.apache.tomcat.util.net.LeaderFol lowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
在org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:689)
在java.lang.Thread.run(未知来源)

Stderr日志:

  2012-10-22 13:06:37 Commons Daemon procrun stderr initialized 
окт22,2012 1:06:38 PM org.apache.catalina.core.AprLifecycleListener init
信息:在java.library.path中找不到在生产环境中实现最佳性能的基于APR的Apache Tomcat Native库: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\仓; C:\Progr am Files\Java\jdk1.7.0_07\lib ;;。
окт22,2012 1:06:38 PM org.apache.coyote.http11.Http11BaseProtocol init
INFO:初始化http-8080上的Coyote HTTP / 1.1
окт22,2012 1:06 :38 PM org.apache.catalina.startup.Catalina load
INFO:初始化处理在531 ms
окт22,2012 1:06:38 PM org.apache.catalina.core.StandardService start
信息:启动服务Catalina
окт22,2012 1:06:38 PM org.apache.catalina.core.StandardEngine start
信息:启动Servlet引擎:Apache Tomcat / 5.5.36
окт22,2012 1:06:38 PM org.apache.catalina.core.StandardHost start
INFO:禁用XML验证
окт22,2012 1:06:39 PM org.apache.catalina。 startup.HostConfig deployWAR
INFO:部署Web应用程序归档gcm-demo.war
окт22,2012 1:06:39 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized
INFO:从资源中读取/api.key(可能来自WEB-INF / classes
окт22,2012 1:06:39 PM org.apache.coyote.http11.Http11Base协议启动
INFO:在http-8080上启动Coyote HTTP / 1.1
окт22,2012 1:06:39 PM org.apache.jk.common.ChannelSocket init
INFO:JK:ajp13听/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加载
INFO:在classpath资源下查找注册表server-registry.xml
окт22,2012 1 :06:39 PM org.apache.catalina.startup.Catalina start
INFO:服务器启动在1219 ms
окт22,2012 1:06:58下午com.google.android.gcm.demo。 server.Datastore寄存器
INFO:注册APA91bF0kArKvvJsHu4qS92FQl-CLKt0CJL8_SrtyL9OkGSqQQUMywMvPhulG4xmdiX_uVhdXs6xERY5pwQzHES-AI-tBCOgMZ_JOBT8S_RIK9XhyQDf49Yfr9g4nSnfgN2GIJHlnqTA4mAJBolnjfuQKLmULl0g5g

I什么已经错过了或者在哪里阅读更多关于这些问题的解决?

解决方案

我只是回答编写了一个类似的问题 - 访问/ gcm演示/ sendAll。原因:HTTP状态码:401



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


As many other newbies to java and android i'm trying to run gcm demo server and gcm demo client on windows, using eclipse to run vertual device and tomcat as a webserer.

I have no problems with registering and unregestering device but i got an error 401 when trying to send a message. Read a lot answers on similar questions but still don't have a clue what i'm doing wrong. I put apy key, server url and sender id in places mentioned in tutorial. Also changed code in SendAllMessagesServlet.java a bit:

// 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);
}

But I still get next error when sending message, here is my tomcat localhost log file:

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

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

What I've missed or where to read more on such a problems solving?

解决方案

I just answered a similar question - accessing /gcm-demo/sendAll. Reason: HTTP Status Code: 401

Check the sender API key that you are using.

这篇关于GCM演示服务器向设备发送消息提示401错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆