Android——搭建GCM项目——服务端和客户端(三)

现在进行到服务器端的部分了,我使用最最简单的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服务了



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值