现在进行到服务器端的部分了,我使用最最简单的Servlet来写,重点贴出向GCM发送的代码
(1) 在接收Client发送过来的Registration ID,我使用xml文件存储起来,代码如下:
<pre code_snippet_id="295784" snippet_file_name="blog_20140416_1_1441928" name="code" class="java">package org.push.service;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.HashMap;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetDeviceId extends HttpServlet{
private HashMap<String,String> device=new HashMap<String,String>();
public static String fileurl="c:\\install\\Sample.xml";
public void service(HttpServletRequest request, HttpServletResponse response){
String RegistrationID=request.getParameter("deviceId");
File file=new File(fileurl);
if (file.exists()){
XMLDecoder decoder;
try {
decoder = new XMLDecoder(
new BufferedInputStream(
new FileInputStream(fileurl)));
device=(HashMap)decoder.readObject();
decoder.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// to check whether the registrationId was already saved.
if (device.containsValue(RegistrationID)){
return;
}
int counter=device.size();
device.put("Device"+counter,RegistrationID);
// Save
XMLEncoder encoder;
try {
encoder = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream(fileurl)));
encoder.writeObject(device);
encoder.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
device.clear();
}
}
(2) 然后使用下面这个类,结合从页面输入的内容向GCM服务器发送信息
package org.push.service;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;
public class GetInputMessage extends HttpServlet{
private static final String apiKey="<span style="font-family:monospace;color:#222222;font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 30px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); display: inline !important; float: none;">AIzaSyCBAMuqv7F1FrHa4FcNA83WjVOTZP1DMPw</span>";
private HashMap<String,String> deviceMap=new HashMap<String,String>();
public void doPost(HttpServletRequest request,HttpServletResponse response){
String title=request.getParameter("title");
String content=request.getParameter("content");
String device=request.getParameter("device");
XMLDecoder decoder;
try {
decoder = new XMLDecoder(
new BufferedInputStream(
new FileInputStream(GetDeviceId.fileurl)));
deviceMap=(HashMap)decoder.readObject();
decoder.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (deviceMap.containsKey(device)){
Sender sender=new Sender(apiKey);
Message message= new Message.Builder().addData("title",title).addData("content",content).build();
Result result=null;
try{
String deviceId=deviceMap.get(device);
result=sender.send(message,deviceId,5);
} catch (IOException e){
e.printStackTrace();
}
}
}
}
其中apiKey就是之前我们注册的apiKey,这里稍微说明一下,因为registration ID非常复杂,不利于在页面进行操作,所以我规定,第一个将registration ID发送到服务器的设备命名为“Device0”,第二台设备为“Device1”,以此类推,方面页面进行操作。
(3) 发送消息页面,非常简单,如下图所示
但是国内使用Google服务非常不稳定,长期会出现连接超时的报错,所以可以使用Chrome的插件进行测试,我在另一篇文章中有描述
这样就可以简单使用GCM服务了