SOD開源框架MSF(消息服務框架)進階篇
阿新 • • 發佈:2017-06-29
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(消息服務框架)進階篇