软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 互联网 -> GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇) -> 正文阅读

[互联网]GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)


今天我们按照之前所说的步骤介绍GCM云推送服务端的开发,因为服务端的开发比客户端的开发较简单,遵从由易到难,一步一步攻破的原则,所以我先于客户端讲服务端的开发,话不多说,让我们开始吧!
首先我们依旧来到首页
[img]http://img.blog.csdn.net/20160321152612184
这次我们点击指南,进入到GCM开发Overview,这里概括了GCM客户端服务器端开发流程。
根据以下的流程图我们不难看出服务端和GCM的通信方式有两种
1.Http协议
2.Xmpp协议
[img]http://img.blog.csdn.net/20160321153002561
Xmpp协议常用于双向通信,我们这里暂时不需要,因此果断选择Http协议来开发。
英语比较好的朋友可以看一下key的概念,这里大概介绍了google是怎么样通过key鉴别发送者和接收者的。
不想了解的朋友只需知道我们要用到
1.Sender ID
2.API Key
3.Registration Token
就行了,然后点击“HTTP Connection Server”开始我们的编程
[img]http://img.blog.csdn.net/20160321153717782
既然选择了http协议通信,那你必须了解http协议相关知识,这里不再阐述,有兴趣的朋友可以来这里了解下推荐入手《HTTP权威指南》。
我们接着来看一下google发布的http service开发指南
[img]http://img.blog.csdn.net/20160321161159882
根据上诉文章我们需要:
-设置http的链接为:https://gcm-http.googleapis.com/gcm/send
-设置http头部参数:Authorization: key=YOUR_API_KEY,
-设置Content-Type:如果发送的消息是json格式,就使用Content-Type: application/json for JSON; 如果是纯文本(比如说一条String字符串)就使用Content-Type:application/x-www-form-urlencoded;charset=UTF-8
其实他这里可能漏了两个参数,一个是http方法 Method 和 Sender ID,Method 是使用http一般都要设置的参数,我们这里使用“post”方法,Sender ID就真的是一个坑了,一开始楼主并不知道有这个参数,怎么发消息都发布出去,问了下有经验的大神才知道Sender ID也要给上才行的。
然后这里说一下,服务端的开发我选择使用.net,不得不说,.net对于一些大型项目的支持真的很好,就是VS比较重量级,不是处处可以布置,也许你会喜欢使用java来写,但是个人感觉面向对象编程语言的逻辑是相同的,楼主一开始学习的是java,然后因为需求兼顾了.net的开发,再后来使用的objective-c,使用起来逻辑并不会出现冲突的情况,顶多就是API和语法个别地方有些不一样,使用起来不是很熟手而已。所以看了我用.net写的服务端程序,你一定很快就能用java copy出来的。
接着就是激动人心的时刻——————上代码!
//建立一个http链接并设置http头部参数
 WebRequest gcmRequest;
 gcmRequest = WebRequest.Create("https://gcm-http.googleapis.com/gcm/send");
 gcmRequest.Method = "post";
 gcmRequest.ContentType = "application/json";
 gcmRequest.Headers.Add(string.Format("Authorization: key={0}", API_KEY));
 gcmRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));

好了,我们接着往下看
[img]http://img.blog.csdn.net/20160321181638794
这里介绍的是发送消息的格式,分别是json和纯文本的格式,我们来看看json的
{ "collapse_key": "score_update",
  "time_to_live": 108,
  "delay_while_idle": true,
  "data": {
    "score": "4x8",
    "time": "15:16.2342"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

参数按照他所说的那样设,要发送的消息写在data内,然后又是一个坑爹的地方“to”,他这个to不知是不是新版本才用到的,我使用的时候他总返回400错误给我,google了一下,把这里的“to”改成“registration_ids”就可以了,修改后的json
{ "collapse_key": "score_update",
  "time_to_live": 108,
  "delay_while_idle": true,
  "data": {
    "message": "Hi lady",
    "time": "15:16.2342"
  },
  "registration_ids" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

好,有格式后我们就可以开始写Http的body部分了
 //把封装好的json打包成byte并以流的形式发送出去
 var postData = b.ToString();
 System.Diagnostics.Debug.WriteLine(postData);
 Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
 gcmRequest.ContentLength = byteArray.Length;
 Stream dataStream = gcmRequest.GetRequestStream();
 dataStream.Write(byteArray, 0, byteArray.Length);
 dataStream.Close();

写好body后就可以发送出去了
 //建立一个接收链接接收返回的数据
 WebResponse tResponse = gcmRequest.GetResponse();
 dataStream = tResponse.GetResponseStream();
 StreamReader tReader = new StreamReader(dataStream);
 String sResponseFromServer = tReader.ReadToEnd();

发送出去我怎么知道他是否成功能?让我们继续看下去
[img]http://img.blog.csdn.net/20160321182739230
[img]http://img.blog.csdn.net/20160321184109639
根据说明,返回的是一组json数据,具体数据代表什么呢?我们直接去看他们返回的代码说明,就是Downstream message error response codes
来到新的页面后直接去看返回代码表
[img]http://img.blog.csdn.net/20160321183847308
[img]http://img.blog.csdn.net/20160321183953121
这里我简单说下几个常见的错误:
1.Missing Registration Token 丢失注册ID
-这个错误一般是你的注册ID格式错误,或者在json上没加双引号,逗号之类。
2.Invalid Registration Token 无效的注册ID
-这个错误一般是你ID有误,少字母,多一横之类的。
3.Unregistered Device 没有注册的设备
-这个错误是说你要发送的android手机没有在google service注册过
4.Authentication Error 认证错误
-这里一般会出现在你的json头参数Authentication 设置错误的时候出现。
5.Mismatched Sender 不匹配的Sender ID
-Sender ID有误
6.Invalid JSON JSON格式有误
好了,以上几个问题是我常遇到的,给大家做个参考。
服务器端功能的代码就这样写完了,是不是很简单?
你可以把代码写到webservice上去,这样就能随时调用了。为了方便,我直接做个简单的页面来实现这个功能,在源码上有,截个实现的图片先
[img]http://img.blog.csdn.net/20160321185444518
这里返回了Invalid Registration,就是说“基友A,舍友B,多个ID英文逗号隔开”是无效的ID,这也是理所当然的,让我们来个成功的
[img]http://img.blog.csdn.net/20160321185855738
成功的话他会返回成功ID,就不会有上面的错误代码出现。
以下是功能所有代码:
    public partial class WebForm1 : System.Web.UI.Page
    {
        private string API_KEY = "你服务器的api——key";
        private string SENDER_ID = "你的senderID";

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            var message = TextBox1.Text;
            var regID = TextBox2.Text;
            String[] regIDAll = new String[] { };
            regIDAll = regID.Split(',');

            //对ID进行双引号的添加
            if (regIDAll.Length > 1)
            {
                regID = "";
                for (int i = 0; i < regIDAll.Length; i++)
                {
                    if (i == 0)
                    {
                        regIDAll[i] = "\"" + regIDAll[i] + "\"";
                    }
                    else
                    {
                        regIDAll[i] = ",\"" + regIDAll[i] + "\"";
                    }
                    regID = regID + regIDAll[i];
                }
            }
            else
            {
                regID = "\"" + regID + "\"";
            }


            //建立一个http链接并设置http头部参数
            WebRequest gcmRequest;
            gcmRequest = WebRequest.Create("https://gcm-http.googleapis.com/gcm/send");
            gcmRequest.Method = "post";
            gcmRequest.ContentType = "application/json";
            gcmRequest.Headers.Add(string.Format("Authorization: key={0}", API_KEY));
            gcmRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));

            //封装发送消息参数成json
            StringBuilder b = new StringBuilder();
            b.Append("{");
            b.Append("\"collapse_key\":\"score_update\",");
            b.Append("\"time_to_live\": 108,");
            b.Append("\"delay_while_idle\": true,");
            b.Append("\"data\": {");
            b.Append("\"message\": \"" + message + "\",");
            b.Append("\"time\": \"" + System.DateTime.Now.ToString() + "\",");
            b.Append(" }");
            b.Append("\"registration_ids\": [");
            b.Append(regID);
            b.Append("]");
            b.Append("}");

            //把封装好的json打包成byte并以流的形式发送出去
            var postData = b.ToString();
            System.Diagnostics.Debug.WriteLine(postData);
            Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            gcmRequest.ContentLength = byteArray.Length;
            Stream dataStream = gcmRequest.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();


            //建立一个接收链接接收返回的数据
            WebResponse tResponse = gcmRequest.GetResponse();
            dataStream = tResponse.GetResponseStream();
            StreamReader tReader = new StreamReader(dataStream);
            String sResponseFromServer = tReader.ReadToEnd();

            //直接在label显示返回的结果
            Label1.Text = "result: " + sResponseFromServer;

            tReader.Close();
            dataStream.Close();
            tResponse.Close();
        }
    }
}

以下是我页面的代码:
<!--注意!!这是APS.NET的代码,要在html文件上运行要稍加修改!!-->


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="css/AndroidPush.css" rel="Stylesheet" type="text/css" />
</head>
<body>
<form id="Form1" runat=server>
    <div class="t-box">
        <div class="box_1">
            <div class="t-con">
                <img src="logo.png" alt="" />
                <div class="abs-box">
                    <div class="con-box">
                        <div class="con">
                            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" Wrap=true Text="这里输入发送的消息"></asp:TextBox>
                            <asp:TextBox ID="TextBox2" runat="server" TextMode="MultiLine" Wrap=true Text="这里输入设备在GCM注册的ID,多个注册ID逗号分开"></asp:TextBox>
                            <div class="result">
                                <asp:Label ID="Label1" runat="server" Text="result:"></asp:Label>
                            </div>
                            <div class="operation"><asp:Button ID="Button1" runat="server" Text="Send" 
                                    onclick="Button1_Click" /></div>

                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </form>
</body>
</html>

最后是万众期待的源码!!!!!
源码在此,请叫我雷锋
......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-03-26 16:26:25  
互联网 最新文章
C++11并发API总结
16.收款(AcceptingMoney)
数据链路层综述
IP协议及IP数据报解析
《浅谈HTTP协议》
计算机网络基础
LoadRunner和RPT之间关于手动关联和参数化的
HTTPS中的对称密钥加密,公开密钥加密,数字
上班需要打卡吗?(开通微信公众号--乘着风
ofbizjmsactivemq
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-20 7:28:48
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --