GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)
2016-03-24 12:34
751 查看
由于谷歌云推送GCM升级成为FCM,所以此博客能容仅供参考 ————2016.12.2更新
今天我们按照之前所说的步骤介绍GCM云推送服务端的开发,因为服务端的开发比客户端的开发较简单,遵从由易到难,一步一步攻破的原则,所以我先于客户端讲服务端的开发,话不多说,让我们开始吧!
首先我们依旧来到首页
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/a27cec2063f325848f9c2186e6a79102)
这次我们点击指南,进入到GCM开发Overview,这里概括了GCM客户端服务器端开发流程。
根据以下的流程图我们不难看出服务端和GCM的通信方式有两种
1.Http协议
2.Xmpp协议
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/2eb16f750e15350aa7bb94ba09a01636)
Xmpp协议常用于双向通信,我们这里暂时不需要,因此果断选择Http协议来开发。
英语比较好的朋友可以看一下key的概念,这里大概介绍了google是怎么样通过key鉴别发送者和接收者的。
不想了解的朋友只需知道我们要用到
1.Sender ID
2.API Key
3.Registration Token
就行了,然后点击“HTTP Connection Server”开始我们的编程
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/41159f741cf7e6c8fd3cf70f4061567e)
既然选择了http协议通信,那你必须了解http协议相关知识,这里不再阐述,有兴趣的朋友可以来这里了解下推荐入手《HTTP权威指南》。
我们接着来看一下google发布的http service开发指南
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/8b468ab47d1f2edbd09e4a2aac9263e1)
根据上诉文章我们需要:
-设置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出来的。
接着就是激动人心的时刻——————上代码!
好了,我们接着往下看
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/59d3c73790522aa3287a803fa7e21c58)
这里介绍的是发送消息的格式,分别是json和纯文本的格式,我们来看看json的
参数按照他所说的那样设,要发送的消息写在data内,然后又是一个坑爹的地方“to”,他这个to不知是不是新版本才用到的,我使用的时候他总返回400错误给我,google了一下,把这里的“to”改成“registration_ids”就可以了,修改后的json
好,有格式后我们就可以开始写Http的body部分了
写好body后就可以发送出去了
发送出去我怎么知道他是否成功能?让我们继续看下去
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/a1085e57cb7ab08e6ad0cd9e029ec386)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/73222a9de7997694e7e701c1c62a50b4)
根据说明,返回的是一组json数据,具体数据代表什么呢?我们直接去看他们返回的代码说明,就是Downstream message error response codes
来到新的页面后直接去看返回代码表
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/07a75ab0cc50ad27c1a765f77c5463cc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/f0a45f273ecb810b918c31cdbb0c8d33)
这里我简单说下几个常见的错误:
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上去,这样就能随时调用了。为了方便,我直接做个简单的页面来实现这个功能,在源码上有,截个实现的图片先
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/425b9af56f19172e6dc8cd453a1efcbe)
这里返回了Invalid Registration,就是说“基友A,舍友B,多个ID英文逗号隔开”是无效的ID,这也是理所当然的,让我们来个成功的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/111a798bba51d459cd0ec43149837d99)
成功的话他会返回成功ID,就不会有上面的错误代码出现。
以下是功能所有代码:
以下是我页面的代码:
最后是万众期待的源码!!!!!
源码在此,请叫我雷锋
今天我们按照之前所说的步骤介绍GCM云推送服务端的开发,因为服务端的开发比客户端的开发较简单,遵从由易到难,一步一步攻破的原则,所以我先于客户端讲服务端的开发,话不多说,让我们开始吧!
首先我们依旧来到首页
这次我们点击指南,进入到GCM开发Overview,这里概括了GCM客户端服务器端开发流程。
根据以下的流程图我们不难看出服务端和GCM的通信方式有两种
1.Http协议
2.Xmpp协议
Xmpp协议常用于双向通信,我们这里暂时不需要,因此果断选择Http协议来开发。
英语比较好的朋友可以看一下key的概念,这里大概介绍了google是怎么样通过key鉴别发送者和接收者的。
不想了解的朋友只需知道我们要用到
1.Sender ID
2.API Key
3.Registration Token
就行了,然后点击“HTTP Connection Server”开始我们的编程
既然选择了http协议通信,那你必须了解http协议相关知识,这里不再阐述,有兴趣的朋友可以来这里了解下推荐入手《HTTP权威指南》。
我们接着来看一下google发布的http service开发指南
根据上诉文章我们需要:
-设置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));
好了,我们接着往下看
这里介绍的是发送消息的格式,分别是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();
发送出去我怎么知道他是否成功能?让我们继续看下去
根据说明,返回的是一组json数据,具体数据代表什么呢?我们直接去看他们返回的代码说明,就是Downstream message error response codes
来到新的页面后直接去看返回代码表
这里我简单说下几个常见的错误:
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上去,这样就能随时调用了。为了方便,我直接做个简单的页面来实现这个功能,在源码上有,截个实现的图片先
这里返回了Invalid Registration,就是说“基友A,舍友B,多个ID英文逗号隔开”是无效的ID,这也是理所当然的,让我们来个成功的
成功的话他会返回成功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>
最后是万众期待的源码!!!!!
源码在此,请叫我雷锋
相关文章推荐
- Seafile Server本地权限提升漏洞(CVE-2014-5443)
- 从USB安装Ubuntu Server 10.04.3 图文详解
- 使用zabbix监控Nginx活动状态--Part1
- 高效访问Internet-启用ISA Server的缓存
- windows server域用户提升到本地更高权限组中的方法
- 完美解决SQL Server 安装问题:以前的某个程序安装已在安装计算机上创建挂起的文件操作
- IIS 错误 Server Application Error 详细解决方法
- 在WINXP系统上安装SQL Server企业版的方法
- SQL Server 存储过程的分页
- SQL Server复制需要有实际的服务器名称才能连接到服务器
- SQL Server 2000向SQL Server 2008 R2推送数据图文教程
- SQL server 表操作介绍
- SQL Server 2000 注入防护大全(二)
- SQL Server 2000 注入防护大全(一)
- NET IIS暴绝对路径漏洞
- 怎样把Windows server 2003转换成工作站系统
- Windows Server 2007四月CTP发布 下载
- IIS运行错误 Server Application Error 错误代码 Error: 8004的解决方法
- Microsoft SQL Server 2008安装图解教程(Windows 7)
- NET LOCALGROUP命令详解(将用户添加到管理员组等)