1. 程式人生 > >SOD開源框架MSF(消息服務框架)進階篇

SOD開源框架MSF(消息服務框架)進階篇

brush pan mtime 初始 函數 啟動 services method quest

復習:在上一篇我介紹了MSF的基本訂閱,模式就是,客戶端A,訂閱服務器。客戶端B,訂閱服務器。通過服務器廣播消息,

所有訂閱過的客戶端都能接到消息。

進階:在上一篇的基礎上,增加客戶端A,發送信息到服務器,服務器把接到的信息,再轉發給所有訂閱了的客戶端。

傳送門:框架的獲取 http://www.cnblogs.com/bluedoctor/

醫生的博客:http://www.pwmis.com/sqlmap/

正文:首先啟動服務器,再單擊按鈕,給所有監聽客戶端,發送消息。按鈕事件的代碼如下:

技術分享

技術分享

  ServiceRequest request = new ServiceRequest();
            request.ServiceName = "TestSendALLClient";
            request.MethodName = "SendMsg";
            request.Parameters = new object[] {txtsend.Text};

            //異步方式測試
            Proxy serviceProxy = new Proxy();
            serviceProxy.ErrorMessage += new EventHandler<MessageSubscriber.MessageEventArgs>(serviceProxy_ErrorMessage);
            serviceProxy.ServiceBaseUri = this.txtSerivceUri.Text;

            int msgId = serviceProxy.Subscribe<string>(request, DataType.Text, (converter) =>
            {
                if (converter.Succeed)
                {
                    MyInvoke(this, () =>
                    {
                        this.lblResult.Text = converter.Result.ToString(); 

                    });
                }
                else
                {
                    MessageBox.Show(converter.ErrorMessage);
                }
            });
            if (msgId < 1)
            {
                MessageBox.Show("訂閱失敗");
            }
            else
            {
                this.btnServerTime.Enabled = false;
            }

        }

重點看一下這裏的發送消息給服務器,ServiceName是類的名字,MethodName 是方法的名字,Parameters 是需要傳給服務器的參數。

這個類、和函數是參考訂閱鬧鐘的的功能來做的。最後在配置文件中註冊剛剛寫的類。運行後,看到,客戶端發送的消息,已經被服務器

接收到了,並分發給訂閱的客戶端了。

技術分享

  request.ServiceName = "TestSendALLClient";
            request.MethodName = "SendMsg";
            request.Parameters = new object[] {txtsend.Text};

技術分享

技術分享

   public ServiceEventSource SendMsg(string msg)
        {
            return new ServiceEventSource(timer,2,() => {
                //要初始化執行的代碼或者方法

                //publishCount = 0;
                //this.AlarmTime = targetTime;
                //timer.Start();

                CurrentContext.PublishData(msg);  

                
//如果上面的代碼是一個執行時間比較長的方法,但又不知道何時執行完成, //並且不想等待超時回收服務對象,而是在執行完成後立即回收服務對象,可以調用下面的代碼: //CurrentContext.PublishEventSource.DeActive(); //註意:調用DeActive 方法後將會停止事件推送,所以請註意此方法調用的時機。 //下面代碼僅做測試,查看服務事件源對象的活動生命周期 //在 ActiveLife 時間之後,一直沒有事件推送,則事件源對象被視為非活動狀態,發布工作線程會被回收。 //在本例中,ActiveLife 為ServiceEventSource 構造函數的第二個參數,值為 2分鐘,可以通過下面一行代碼證實: int life = CurrentContext.PublishEventSource.ActiveLife; //如果上面執行的是一個執行時間比較長的方法,並且有返回值,想將返回值也推送給訂閱端,可以再次執行CurrentContext.PublishData //CurrentContext.PublishData(DateTime.Now); //如果事件推送結束,需要設置事件源為非活動狀態,否則,需要等待 ActiveLife 時間之後自然過期成為非活動狀態。 //如果你無法確定事件推送何時結束,請不要調用下面的方法 //CurrentContext.PublishEventSource.DeActive(); }); }

技術分享

      <Add Key="TestSendALLClient" InterfaceName="IService" FullClassName="ServiceSample.TestSendALLClient" Assembly="ServiceSample" />

技術分享

技術分享

SOD開源框架MSF(消息服務框架)進階篇