`

wp wp8:服务器推送

    博客分类:
  • wp
wp 
阅读更多
前提:必须使用真机,真机注册

服务器端使用的是winform做的

客户端wp8系统 nokia920

client代码:

图:



注意一定要在wmappmanifest.xml中勾选 pushnotifiation 图:



上代码:

MainPage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using push_client.Resources;
using Microsoft.Phone.Notification;

namespace push_client
{
    public partial class MainPage : PhoneApplicationPage
    {

        // 构造函数 
        public MainPage()
        {
            HttpNotificationChannel myChannel = null;
            // 推送信道的名字,随便取一个就行了 
            string ChannelName = "ToastChannel";
            InitializeComponent();
            // Find静态方法可以根据名字查找信道 
            myChannel = HttpNotificationChannel.Find(ChannelName);
            // 如果找不到,就要创建一个了 
            if (myChannel == null)
            {
                myChannel = new HttpNotificationChannel(ChannelName);
                // 注册事件 
                myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
                myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
                myChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);
                // 打开信道 
                myChannel.Open();
                // 绑定Toast通知,这样在程序不在前台时才会显示 
                // 屏幕上方的通知提示条 
                myChannel.BindToShellToast();
            }
            else
            {
                // 如果存在,还要注册一次事件,因为在程序被扔到后台后可能会删除事件绑定 
                myChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(myChannel_ChannelUriUpdated);
                myChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(myChannel_ErrorOccurred);
                myChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(myChannel_ShellToastNotificationReceived);

                // 在“输出”窗输出URL,因为我们只是测试,这样一来方便一点 
                System.Diagnostics.Debug.WriteLine("通道URI为:{0}", myChannel.ChannelUri.ToString());
            }
        }

        void myChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
        {
            string msg = "";
            foreach (string key in e.Collection.Keys)
            {
                msg += key + " : " + e.Collection[key] + "\r\n";
            }
            Dispatcher.BeginInvoke(() =>
            {
                //this.txtInfo.Text = msg;
                System.Diagnostics.Debug.WriteLine(msg);
            });
        }

        void myChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
        {
            //Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));
            System.Diagnostics.Debug.WriteLine(e.Message);
        }

        void myChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            // 当URL发生改变后,还要输出一次 
            // 保证我们得到的是最新版本的URI 
            Dispatcher.BeginInvoke(() =>
            {

                //服务器端要用到的uri
                System.Diagnostics.Debug.WriteLine("通道URI:{0}", e.ChannelUri.ToString());
            });
        }

        // 这个方法不用我多介绍了 
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            if (NavigationContext.QueryString.ContainsKey("toastmsg"))
            {
                //this.txtInfo.Text = NavigationContext.QueryString["toastmsg"];
            }
        } 
       
    }
}



ReceiveMessagePage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace push_client
{
    public partial class ReceiveMessagePage : PhoneApplicationPage
    {
        public ReceiveMessagePage()
        {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

            try
            {
                string t1String = "";

                if (NavigationContext.QueryString.TryGetValue("tp1", out t1String))
                {
                    t1.Text = t1String;

                }

                string t2String = "";

                if (NavigationContext.QueryString.TryGetValue("tp2", out t2String))
                {
                    t2.Text = t2String;

                }
            }
            catch (Exception)
            {

            }

        }

    } 
}

服务器端代码:

图:



上代码:

Form1.Designer.cs

using System;
using System.Windows.Forms;
namespace push_service
{
    partial class Form1
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码


        TextBox txtResult;

        TextBox txtValue1;
        TextBox txtValue2;

        private void InitializeComponent()
        {
            this.SuspendLayout();
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 261);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.Width = 800;

            Button button = new Button();
            button.Width = 80;
            button.Height = 30;
            button.Left = 340;
            button.Top = 30;
            button.Text = "执   行";
            button.Click += new EventHandler(btnSend_Click);
            this.Controls.Add(button);

            txtValue1 = new TextBox();
            txtValue1.Text = "显示在toast中的参数1";
            txtValue1.Left = 10;
            txtValue1.Top = 10;
            txtValue1.Width = 300;
            txtValue1.Height = 50;
            this.Controls.Add(txtValue1);

            txtValue2 = new TextBox();
            txtValue2.Text = "显示在toast中的参数2";
            txtValue2.Left = 10;
            txtValue2.Top = 60;
            txtValue2.Width = 300;
            txtValue2.Height = 50;
            this.Controls.Add(txtValue2);

            txtResult = new TextBox();
            txtResult.Left = 10;
            txtResult.Top = 120;
            txtResult.Width = 300;
            txtResult.Height = 50;
            this.Controls.Add(txtResult);

        }

        #endregion
    }
}

Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace push_service
{
    public partial class Form1 : Form
    {

      

        public Form1()
        {
            InitializeComponent();

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            //uri是客户端 在注册之后 运行在真机上得到的uri
            string URI = "http://db3.notify.live.net/throttledthirdparty/*************************";
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI);
            myRequest.ContentType = "text/xml";
            myRequest.Headers.Add("X-WindowsPhone-Target", "toast");
          
            /*
             *   X-NotificationClass 处理间隔
             *   2 - 立即发送
             *   12 - 450秒内发送
             *   22 - 900秒内发送
             */
            myRequest.Headers.Add("X-NotificationClass", "2");

            // 要发送的内容 
            //注意:Param中&要转义为&amp;
            string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
            "<wp:Notification xmlns:wp=\"WPNotification\">" +
                "<wp:Toast>" +
                    "<wp:Text1>" + txtValue1.Text + "</wp:Text1>" +
                    "<wp:Text2>" + txtValue2.Text + "</wp:Text2>" +
                    "<wp:Param>" + "/ReceiveMessagePage.xaml?tp1=" + "11" + "&amp;tp2=" + "22"
                  + "</wp:Param>" +
                "</wp:Toast>" +
            "</wp:Notification>";

            byte[] buffer = Encoding.UTF8.GetBytes(toastMessage);
            myRequest.ContentLength = buffer.Length;
            myRequest.Method = "POST";

            using (System.IO.Stream stream = myRequest.GetRequestStream())
            {
                stream.Write(buffer, 0, buffer.Length);
            }

            // 接收回应 
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

            string headers = "";
            foreach (var hd in myResponse.Headers.AllKeys)
            {
                headers += hd + " : " + myResponse.Headers[hd] + " | ";
            }
            headers += "\r\n";
            string msg = "";
            using (System.IO.Stream recStream = myResponse.GetResponseStream())
            {
                System.IO.StreamReader reader = new System.IO.StreamReader(recStream, Encoding.UTF8);
                msg = reader.ReadToEnd();
                reader.Close();
            }
            msg += "\r\n\r\n";
            txtResult.AppendText(headers + msg);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        } 
    }
}

服务器端运行效果:



客户端接受效果:

分享到:
评论

相关推荐

    WP7推送通知DEMO

    在Windows Phone 7 (WP7)平台上,推送通知(Push Notifications)是开发者向用户设备发送实时信息的一种机制,它使得应用程序即使在后台运行或者完全关闭的状态下也能接收到来自服务器的数据更新。本DEMO旨在展示...

    wp7手机开发-推送通知服务

    【Windows Phone 7 (WP7) 手机开发 - 推送通知服务】 Windows Phone 7平台引入了一项创新功能,即Push Notification Service (PNS),这是一个强大的通信管道,允许应用开发者与用户进行实时交互。这项服务使得应用...

    push:推送服务,使用开源的gopush框架,基于akka实现的高性能推送服务。ios会推送到apns,wp推送到microsoft的推送服务器上,支持分布式

    ios会推送到apns,wp推送到microsoft的推送服务器上,支持分布式##特性1、轻量级,完全依赖akka2、高性能3、纯scala实现,部分方法使用java4、支持设置过期机制(用于gopush推送)5、支持client消息发送失败重传机制...

    读书巴士 For WP8 v1.6.1.0

    3. **实时更新**:服务器会及时推送新书信息、更新现有书籍内容或修复已知问题,保持应用的活力和吸引力。 4. **社交互动**:如果应用包含评论、分享、讨论等功能,服务器还会处理用户间的互动数据,如评论内容、...

    windowphone 推送通知

    本项目以"windowphone 推送通知"为主题,提供了相关的源码,旨在帮助开发者理解和实践Windows Phone 7(简称WP7)平台上的推送通知服务。 首先,我们需要了解Windows Phone的推送通知系统,它基于Microsoft的...

    推送通知服务PushNotificationDem

    推送通知服务(PushNotificationDemo)是针对Windows Phone 7(WP7)平台设计的一种技术,旨在帮助开发者构建能够接收远程消息的应用程序。这种服务允许服务器端向客户端发送数据,即使应用在后台或完全关闭状态下也...

    Windows Phone开发(45):推送通知大结局——Raw通知(源码)

    1. **配置服务器端**:你需要一个推送服务器,如Azure Notification Hubs,用于发送推送通知。服务器端需要获取Windows Phone应用的通道URI,这是一个用于接收通知的唯一标识。 2. **获取Channel URI**:在Windows ...

    腾讯微博分享

    一键分享是指用户只需点击一次按钮,即可将内容推送到预设的社交网络上,简化了传统多步骤的分享流程,极大地提高了用户体验。腾讯微博的一键分享功能,正是基于这种设计理念,使用户能够快速、简便地将自己的微博...

    WP 微信SDK示例

    微信服务器会向应用推送消息,如支付结果通知。开发者需要设置消息处理函数,监听并处理这些通知,更新应用状态。 8. **Demo程序** 提供的"Demo程序"包含了上述功能的实例代码,开发者可以通过分析和运行这个示例...

    WP7校园课程管理源码

    1. `NotificationsServices.asmx`:这是一个Web服务文件,可能用于实现推送通知功能,例如提醒学生上课时间或者更新课程信息。 2. `DesignTimeResolveAssemblyReferences.cache` 和 `ResolveAssemblyReference.cache...

    WP7 天气预报代码,非常好的天气预报

    可以集成WP7的推送通知服务,当天气状况有重大变化时,向用户发送提醒。 9. **性能优化**: 为了提高加载速度,可以对数据请求和解析过程进行优化,例如分批加载城市数据,只在需要时加载详细预报,以及使用缓存...

    wp-fastest-cache-premium-v1.5.7_cache_

    10. **高级设置**:如HTTP2推送、WebP图片转换等,提供更多性能优化的可能性。 在使用WP Fastest Cache Premium时,用户需要注意合理配置各项设置,根据自己的网站需求和服务器环境进行调整。例如,对于流量较大的...

    wordpress采集插件wp-autopost-pro专业版

    - **API集成**:与第三方服务(如社交媒体、邮件订阅)集成,发布内容的同时自动推送到其他平台。 - **用户权限控制**:设定不同用户角色对采集和发布的权限,便于团队协作管理。 在实际使用中,WP-Autopost-Pro...

    [培训]WP_第5章_数据存储 网络 推送_Demo

    【WP_第5章_数据存储 网络 推送_Demo】是Windows Phone技术培训资料中的一个重要章节,主要涵盖了在Windows Phone平台上进行数据存储、网络通信以及推送通知的相关技术。这一章节通过一系列的Demo实例,帮助开发者...

    wp-rocket-2.10.10

    6. **HTTP2推送**:利用HTTP2协议,预加载资源,使得页面元素并行加载,提高整体速度。 7. **CDN集成**:支持与各种CDN(内容分发网络)服务集成,通过全球服务器网络分发内容,进一步提升全球用户的访问速度。 8....

    wp2baidu1.0.4问题修复

    这款插件通过API接口与百度空间进行交互,将WordPress的文章、页面等数据实时或定时推送到百度空间,以此扩大内容的覆盖面,增加搜索引擎的抓取几率,提升网站的流量。然而,在wp2baidu1.0.4版本中,部分用户发现这...

    wp7阅读器源代码

    9. **通知服务**:如果应用支持实时更新,可能还包含了推送通知服务(PNS)的集成,如Toast通知和Tile更新。 10. **调试和测试**:学习源码的同时,你也应该了解如何在模拟器或真实设备上调试和测试应用,确保其在...

    wpio:用于 wp 的 socketio nodejs 聊天服务器

    1. **WebSocket技术**:WebSocket是一种在客户端和服务器之间建立长连接的协议,它提供了全双工的通信渠道,允许服务器主动向客户端推送数据。与传统的HTTP协议不同,WebSocket在建立连接后可以保持连接状态,减少了...

    推送通知测试应用服务端

    2、那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户端应用程序在创建推送通道时,微软的通知服务器会为手机分配一个URL,我的服务器只要知道这个URL就可以向指定的手机发送消息。所以,...

    基于PHP的worldpress 新浪微博同步插件 WP-Connect For WordPress.zip

    这个插件利用PHP编程语言的优势,为用户提供了方便快捷的方式来扩展其社交媒体影响力,通过将博客文章实时推送到新浪微博平台,增加内容的曝光度和互动性。 【描述】该插件的核心功能是将WordPress的发布功能与新浪...

Global site tag (gtag.js) - Google Analytics