百度云推送java服务器怎么弄

Python018

百度云推送java服务器怎么弄,第1张

百度云(Baidu Cloud)是百度推出的一项云存储服务,首次注册即有机会获得2T的空间,已覆盖主流PC和手机操作系统,包含Web版、Windows版、Mac版、Android版、iphone版和Windows Phone版,用户将可以轻松将自己的文件上传到网盘上,并可跨终端随时随地查看和分享。

百度云推送

百度提供了完整的Demo帮助开发者集成云推送服务,推送服务SDK通过.jar包和.so文件的方式可以集成到我们自己的工程中。在此之前,需要到百度开发者中心进行应用注册并获取API Key,这个作为使用推送服务应用的唯一标示,具体流程我就不赘述了,需要使用的话可以直接访问百度开发者中心进行查看。

下面主要看看Android_SDK的整体概览和内部运行机制:

上图是百度云推送Android_SDK的框架图,通过SDK可以绕过复杂的Push HTTP/HTTPS API直接和Push服务器进行交互,主要提供如下功能:

Push服务初始化以及Client注册绑定

创建或删除标签(Tag)

接收Push Server的通知并提供自定义展现消息方式

推送统计分析功能,包括通知的点击和删除统计以及应用使用情况统计

富媒体推送

在Android端,总共实现了三个Receiver和一个Service,其中,一个Receiver是用来处理注册绑定后接收服务端返回的channelID等信息:

<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver" android:process=": bdservice_v1"><intent-filter><action android:name="com.baidu.android.pushservice.action.METHOD " /><action android:name="com.baidu.android.pushservice.action.BIND_SYNC " /></intent-filter><intent-filter><action android:name="android.intent.action.PACKAGE_REMOVED"/><data android:scheme="package" /></intent-filter></receiver>

第二个Receiver是用于接收系统消息以保证PushService正常运行:

<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver" android:process=": bdservice_v1"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /><action android:name="com.baidu.android.pushservice.action.notification.SHOW" /><action android:name="com.baidu.android.pushservice.action.media.CLICK" /></intent-filter></receiver>

第三个Receiver就是开发者自己实现的用来接收并处理推送消息:

<receiver android:name="your.package.PushMessageReceiver"><intent-filter><!-- 接收 push 消息 --><action android:name="com.baidu.android.pushservice.action.MESSAGE" /><!-- 接收 bind、setTags 等 method 的返回结果 --><action android:name="com.baidu.android.pushservice.action.RECEIVE" /></intent-filter></receiver>

一个Service就是在后台运行的用于保障与Push Server维持长连接并做相关处理的后台服务:

<service android:name="com.baidu.android.pushservice.PushService" android:exported="true" android:process=" bdservice_v1"/><!-- push service end -->

在开发者自己需要处理的广播接收器中,可以对接收到的推送消息进行处理,Push消息通过 action为com.baidu.android.pushservice.action.MESSAGE的Intent把数据发送给客户端your.package.PushMessageReceiver,消息格式由应用自己决定,PushService只负责把服务器下发的消息以字符串格式透传给客户端。接口调用回调通过action为com.baidu.android.pushservice.action.RECEIVE的Intent 返回给your.package.PushMessageReceiver。

PushMessageReceiver.java

/** * Push消息处理receiver * @Author Ryan * @Create 2013-8-6 下午5:59:38 */ public class PushMessageReceiver extends BroadcastReceiver { public static final String TAG = PushMessageReceiver.class.getSimpleName() @Override public void onReceive(final Context context, Intent intent) {if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) { //获取消息内容 String message = intent.getExtras().getString( PushConstants.EXTRA_PUSH_MESSAGE_STRING) //消息的用户自定义内容读取方式 Log.i(TAG, "onMessage: " + message) } else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) { //处理绑定等方法的返回数据 //PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到//获取方法 final String method = intent .getStringExtra(PushConstants.EXTRA_METHOD) //方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。 //绑定失败的原因有多种,如网络原因,或access token过期。 //请不要在出错时进行简单的startWork调用,这有可能导致死循环。 //可以通过限制重试次数,或者在其他时机重新调用来解决。 final int errorCode = intent .getIntExtra(PushConstants.EXTRA_ERROR_CODE, PushConstants.ERROR_SUCCESS) //返回内容 final String content = new String( intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT)) //用户在此自定义处理消息,以下代码为demo界面展示用Log.d(TAG, "onMessage: method : " + method) Log.d(TAG, "onMessage: result : " + errorCode) Log.d(TAG, "onMessage: content : " + content) } } }

通过在入口Activity的onCreate方法中进行推送服务的注册绑定后,即可在推送管理后台或是自己的应用服务器上进行消息推送的操作了。

PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, "you_api_key")

另外,云推送提供php、java等Server端的SDK供开发者在自己的服务器上实现推送服务进行定制化管理和操作。

四、单服务单通道机制

百度云推送实现了单服务单通道的机制,如果在一台Device上安装了多款Push SDK的应用,不会为每个应用都创建PushService,而是会采用多应用共享一个PushService的模式。这样既能减少资源消耗也能降低网络流量。PushService运行于一个独立进程,没有和主进程运行于同一进程,所以主进程不需要常驻内存,当有新的Push消息时,PushService会通过Intent发送消息给主进程进行处理。通过Intent,以指定目标应用包名的方式,发送私有消息给应用。应用即不能接收不属于自己的消息,也不能截取别人的消息,同时又降低了消耗,如下为示意图:

后记:如今,国内提供Android推送服务的还有很多家,例如个推和极光推送等,实现的原理大同小异,开发者可以根据自身需要进行选择。

要接入七牛云存储,您需要拥有一对有效的 Access Key 和 Secret Key 用来进行签名认证。可以通过如下步骤获得:

开通七牛开发者帐号

登录七牛开发者自助平台,查看 Access Key 和 Secret Key

在获取到 Access Key 和 Secret Key 之后,您可以按照如下方式进行密钥配置:

Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY)

上传下载接口

上传流程

在七牛云存储中,整个上传流程大体分为这样几步:

业务服务器颁发 uptoken(上传授权凭证)给客户端(终端用户)

客户端凭借 uptoken 上传文件到七牛

在七牛获得完整数据后,根据用户请求的设定执行以下操作:

a. 如果用户设定了returnUrl,七牛云存储将反馈一个指向returnUrl的HTTP 303,驱动客户端执行跳转;

b. 如果用户设定了callbackUrl,七牛云存储将向callbackUrl指定的地址发起一个HTTP 请求回调业务服务器,同时向业务服务器发送数据。发送的数据内容由callbackBody指定。业务服务器完成回调的处理后,可以在HTTP Response中放入数据,七牛云存储会响应客户端,并将业务服务器反馈的数据发送给客户端;

c. 如果两者都没有设置,七牛云存储根据returnBody的设定向客户端发送反馈信息。

需要注意的是,回调到业务服务器的过程是可选的,它取决于业务服务器颁发的 uptoken。如果没有回调,七牛会返回一些标准的信息(比如文件的 hash)给客户端。如果上传发生在业务服务器,以上流程可以自然简化为:

业务服务器生成 uptoken(不设置回调,自己回调到自己这里没有意义)

凭借 uptoken 上传文件到七牛

善后工作,比如保存相关的一些信息

原因:您的百度版本错误,并没有使用正确方法建立;

如何正确创建bucket:

第一步:成为百度云开发者

要想利用百度云提供的接口和服务,理所当然,先成为百度开发者,实际上只要有百度账号(百度帖吧,百度网盘共用的一个号)就够了。

点击右方链接,上面有图文详解:http://jingyan.baidu.com/article/25648fc1defccd9190fd004f.html

第二步:在百度云平台上创建应用

参考官方文档:

点击http://developer.baidu.com/wiki/index.php?title=docs/pcs/guide/app_create打开链接

第三步:如何利用云存储

分三步来说明问题:

1.要实现代码和百度云的连接,总有一个东西作为桥梁,百度提供了一个bucket(木桶)其带有两个密码:AK和SK,

可以在代码中加入对应的bucket(附带Ak和Sk)实现与百度云存储的连接,实现上传和下载的功能。

下面说一下如何在存储里创建bucket,先看一下官方文档的步骤如下连接:

http://developer.baidu.com/wiki/index.php?title=docs/cplat/bcs/console2.0

但会发现无法创建bucket!!!!!!!!!!!!!!

其实百度云官方给的步骤是对的。

一定要在旧版控制台界面创建bucket!因为新版百度云平台没有这个功能,旧版的所有功能还没有完全搬迁到新界面上!!!!!!!!!

打开旧版控制中心链接:http://developer.baidu.com/bae/bcs/bucket/

一定要在此按照官方步骤创建bucket!

2.获取java-sdk的jar包,导入eclipse

跨过上一步百度云比较坑的坎,接下来相信都是很简单的了。

点击获取Java-sdk-jar包,获取下载成功后,导入eclipse工程即可,这里不再详细展开。

http://developer.baidu.com/wiki/index.php?title=docs/cplat/bcs/sdk

3.编写代码,实现自己写的Java代码和百度云存储的bucket的连接,上传下载文件。

java代码:

<span style="font-size:14px">import java.io.ByteArrayInputStream

import java.io.IOException

import com.baidu.inf.iis.bcs.BaiduBCS

import com.baidu.inf.iis.bcs.auth.BCSCredentials

import com.baidu.inf.iis.bcs.model.ObjectMetadata

import com.baidu.inf.iis.bcs.model.X_BS_ACL

import com.baidu.inf.iis.bcs.request.CreateBucketRequest

import com.baidu.inf.iis.bcs.request.PutObjectRequest

public class CloudStorage {

<pre name="code" class="java" style="font-size:18px"> private final static String BUCKET = "photo-bucket"//一定是你的bucket名称

private final static String AK = "AK"//你的bucket的附带的AK和SK码

private final static String SK = "SK"

private final static String HOST = "bcs.duapp.com" //百度云存储的主机名称

private final static BaiduBCS BAIDU_BCS = new BaiduBCS(new BCSCredentials(AK,SK),HOST)

public static void upload(String fileName, byte[] contents) throws IOException {

ObjectMetadata objectMetadata = new ObjectMetadata()

objectMetadata.setContentEncoding("utf-8")

objectMetadata.setContentLength(contents.length)

PutObjectRequest request = new PutObjectRequest(BUCKET, fileName,

new ByteArrayInputStream(contents), objectMetadata)

boolean isExist = BAIDU_BCS.doesObjectExist(BUCKET, fileName)

if(isExist){

System.out.println("文件已经存在!")

return

}

BAIDU_BCS.putObject(request)

}

public static void main(String[] args) throws IOException {

String fileName = "/aaaa/我是中文"

for(int i = 0i <10i++){

upload(fileName+"_"+i+".txt","测试一下中文1111".getBytes())

}

}

} </span>