wcf全面解析proj1企業(yè)內(nèi)部交流平臺.ppt
《wcf全面解析proj1企業(yè)內(nèi)部交流平臺.ppt》由會員分享,可在線閱讀,更多相關(guān)《wcf全面解析proj1企業(yè)內(nèi)部交流平臺.ppt(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。
BF-TECH 4.0 DNET 軟件開發(fā)工程師高薪就業(yè)品牌課程 版權(quán)所有:北風(fēng)網(wǎng),使用WCF搭建企業(yè)通用架構(gòu) 講師:石曼迪,項目案例1:企業(yè)內(nèi)部交流平臺,目錄,內(nèi)部交流平臺需求 內(nèi)部交流平臺技術(shù)選型 內(nèi)部交流平臺設(shè)計 內(nèi)部交流平臺實現(xiàn) 內(nèi)部交流平臺演示 內(nèi)部交流平臺項目總結(jié),目標,熟悉WCF開發(fā) 了解WPF開發(fā) 了解通信原理,項目成果展示,,項目成果展示,,內(nèi)部交流平臺背景,衡量溝通效果的四個指標:方便性、及時性、有效性、可追溯性。先看一下我們對各種溝通方式的對比分析: 面對面溝通; 電話溝通; Email電子郵件; IM即時通訊;,內(nèi)部交流平臺背景,我們需要溝通…… 我們能實現(xiàn)及時溝通……,內(nèi)部交流平臺技術(shù)選型,,內(nèi)部交流平臺技術(shù)選型,套接字編程? 不要 復(fù)雜的配置? 不要 開發(fā)成本高? 不要 維護性能差? 不要 平臺兼容性不好? 不要 擴展性差? 不要 協(xié)議單一? 不要 那我們要啥? WCF能夠滿足這些要求!,內(nèi)部交流平臺設(shè)計,采用WCF服務(wù)端+客戶端方式; 通過TCP/IP通信協(xié)議; 采用WPF界面開發(fā)(設(shè)備無關(guān)性); 采用ServiceThrottlingBehavior高性能配置建議;,內(nèi)部交流平臺實現(xiàn):服務(wù)端,采用HTTP和TCP/IP兩種協(xié)議進行通訊 采用WPF應(yīng)用程序作為宿主 端口IP自配置,內(nèi)部交流平臺實現(xiàn):服務(wù)端,類圖,內(nèi)部交流平臺實現(xiàn):服務(wù)端,類圖,內(nèi)部交流平臺實現(xiàn):服務(wù)端,界面實現(xiàn),Local IP: Listen Port: Stop Start Status Chat Service,內(nèi)部交流平臺實現(xiàn):服務(wù)端,引用程序集,內(nèi)部交流平臺實現(xiàn):服務(wù)端,定義一個服務(wù): 設(shè)置文件傳輸參數(shù),Uri httpAdrs = new Uri(“http://“ + textBoxIP.Text.ToString() + “:“ + (int.Parse(textBoxPort.Text.ToString()) + 1).ToString() + “/WPFHost/“); Uri[] baseAdresses = { tcpAdrs, httpAdrs }; host = new ServiceHost(typeof(ServiceAssembly.ChatService), baseAdresses);,NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true); //設(shè)置文件傳輸最大為 64 MB tcpBinding.MaxBufferPoolSize = (int)67108864; tcpBinding.MaxBufferSize = 67108864; tcpBinding.MaxReceivedMessageSize = (int)67108864; tcpBinding.TransferMode = TransferMode.Buffered; tcpBinding.ReaderQuotas.MaxArrayLength = 67108864; tcpBinding.ReaderQuotas.MaxBytesPerRead = 67108864; tcpBinding.ReaderQuotas.MaxStringContentLength = 67108864;,內(nèi)部交流平臺實現(xiàn):服務(wù)端,打開優(yōu)化配置: 設(shè)置保持連接,ServiceThrottlingBehavior throttle; throttle = host.Description.Behaviors.Find(); if (throttle == null) { throttle = new ServiceThrottlingBehavior(); throttle.MaxConcurrentCalls = 100; throttle.MaxConcurrentSessions = 100; host.Description.Behaviors.Add(throttle); },//保持連接 20 hours. tcpBinding.ReceiveTimeout = new TimeSpan(20, 0, 0); tcpBinding.ReliableSession.Enabled = true; tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(20, 0, 10); host.AddServiceEndpoint(typeof(ServiceAssembly.IChat), tcpBinding, “tcp“);,內(nèi)部交流平臺實現(xiàn):服務(wù)端,開啟服務(wù):,try { host.Open(); } catch (Exception ex) { labelStatus.Content = ex.Message.ToString(); } finally { if (host.State == CommunicationState.Opened) { labelStatus.Content = “Opened“; buttonStop.IsEnabled = true;,內(nèi)部交流平臺實現(xiàn):服務(wù)端,測試服務(wù):,http://localhost:7998/WPFHost/,內(nèi)部交流平臺實現(xiàn):服務(wù)端,配置文件:,,內(nèi)部交流平臺實現(xiàn):客戶端,采用WPF應(yīng)用程序作為客戶端表現(xiàn): 增加頭像和文件傳輸,內(nèi)部交流平臺實現(xiàn):客戶端,增加服務(wù)引用 net.tcp://localhost:7996/WPFHost/mex,內(nèi)部交流平臺實現(xiàn):客戶端,界面實現(xiàn):,,內(nèi)部交流平臺實現(xiàn):客戶端,定義事件: 定義客戶端集合,this.Loaded += new RoutedEventHandler(Window1_Loaded); chatListBoxNames.SelectionChanged += new SelectionChangedEventHandler(chatListBoxNames_SelectionChanged); chatTxtBoxType.KeyDown += new KeyEventHandler(chatTxtBoxType_KeyDown); chatTxtBoxType.KeyUp += new KeyEventHandler(chatTxtBoxType_KeyUp);,Dictionary OnlineClients = new Dictionary();,內(nèi)部交流平臺實現(xiàn):客戶端,定義狀態(tài)判斷:,if (proxy != null) { switch (this.proxy.State) { case CommunicationState.Closed: proxy = null; loginButtonConnect.IsEnabled = true; break; case CommunicationState.Closing: break; case CommunicationState.Created: break; case CommunicationState.Faulted: proxy.Abort(); break; case CommunicationState.Opened: ShowLogin(false); break; case CommunicationState.Opening: break;,內(nèi)部交流平臺實現(xiàn):客戶端,建立客戶端連接:,string servicePath = . proxy.Endpoint.Address = . proxy.Open(); proxy.InnerDuplexChannel.Faulted += new EventHandler(InnerDuplexChannel_Faulted); proxy.InnerDuplexChannel.Opened += new EventHandler(InnerDuplexChannel_Opened); proxy.InnerDuplexChannel.Closed += new EventHandler(InnerDuplexChannel_Closed); proxy.ConnectAsync(this.localClient); proxy.ConnectCompleted += new EventHandler(proxy_ConnectCompleted);,內(nèi)部交流平臺實現(xiàn):客戶端,消息發(fā)送:,if ((bool)chatCheckBoxWhisper.IsChecked) { if (this.receiver != null) { proxy.WhisperAsync(msg, this.receiver); chatTxtBoxType.Text = ““; chatTxtBoxType.Focus(); } } else { proxy.SayAsync(msg); chatTxtBoxType.Text = ““; },內(nèi)部交流平臺實現(xiàn):客戶端,添加頭像:,Dictionary images = new Dictionary(); int i = 0; foreach (Stream strm in picsStrm) { PngBitmapDecoder decoder = new PngBitmapDecoder(strm, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bitmap = decoder.Frames[0] as BitmapSource; Image img = new Image(); img.Source = bitmap; img.Stretch = Stretch.UniformToFill; images.Add(i, img); i++; strm.Close(); } return images;,內(nèi)部交流平臺實現(xiàn):客戶端,文件發(fā)送:,OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = false; strm = fileDialog.OpenFile(); if (strm != null) { byte[] buffer = new byte[(int)strm.Length]; int i = strm.Read(buffer, 0, buffer.Length); if (i 0) { SVC.FileMessage fMsg = new FileMessage(); fMsg.FileName = fileDialog.SafeFileName; fMsg.Sender = this.localClient.Name; fMsg.Data = buffer; proxy.SendFileAsync(fMsg, this.receiver); proxy.SendFileCompleted += new EventHandler(proxy_SendFileCompleted); chatLabelSendFileStatus.Content = “Sending.“; } },內(nèi)部交流平臺實現(xiàn):客戶端,文件接收:,try { FileStream fileStrm = new FileStream(rcvFilesPath + fileMsg.FileName, FileMode.Create, FileAccess.ReadWrite); fileStrm.Write(fileMsg.Data, 0, fileMsg.Data.Length); chatLabelSendFileStatus.Content = “Received file, “ + fileMsg.FileName; } catch (Exception ex) { chatLabelSendFileStatus.Content = ex.Message.ToString(); },內(nèi)部交流平臺實現(xiàn):客戶端,用戶登錄和注銷:,public void UserJoin(WPFClient.SVC.Client client) { ListBoxItem item = MakeItem(client.AvatarID, “------------ “ + client.Name + “ joined chat ------------“); chatListBoxMsgs.Items.Add(item); ScrollViewer sv = FindVisualChild(chatListBoxMsgs); sv.LineDown(); },public void UserLeave(WPFClient.SVC.Client client) { ListBoxItem item = MakeItem(client.AvatarID, “------------ “ + client.Name + “ left chat ------------“); chatListBoxMsgs.Items.Add(item); ScrollViewer sv = FindVisualChild(chatListBoxMsgs); sv.LineDown(); },內(nèi)部交流平臺實現(xiàn):客戶端,配置文件:,,,內(nèi)部交流平臺演示,,內(nèi)部交流平臺項目總結(jié),為什么要使用 net.tcp 綁定 為了更好地實現(xiàn)雙向通信,.NET Framework在 3.0的時候引入了一個全新 的通信協(xié)議Net.TCP并作為WCF的一部分。它極大地改進了吞吐量 和連接的數(shù)量。 WCF服務(wù)寄宿方式 WCF服務(wù)寄宿方式:通過自我寄宿的方式寄宿服務(wù)和通過IIS寄宿服務(wù)服務(wù)寄宿的目的就是開啟一個進程,為WCF服務(wù)提供一個運行的環(huán)境。通過為服務(wù)添加一個或多個終結(jié)點,使之暴露給潛給的服務(wù)消費者。服務(wù)消費者最終通過相匹配的終結(jié)點對該服務(wù)進行調(diào)用。,總結(jié),WCF通信技術(shù) WPF開發(fā)技術(shù) WCF通信優(yōu)化技術(shù),WCF視頻教程:使用WCF搭建企業(yè)通用架構(gòu) 學(xué)習(xí)地址:,歡迎訪問我們的官方網(wǎng)站 ,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- wcf 全面 解析 proj1 企業(yè)內(nèi)部 交流平臺
鏈接地址:http://m.hcyjhs8.com/p-2721104.html