日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用WCF的P2P共享剪贴板上的数据

發(fā)布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用WCF的P2P共享剪贴板上的数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

WCF與P2P???

??? WCF是用來實現(xiàn)數(shù)據(jù)通信的,這篇文章中。我將帶領(lǐng)大家進入WCF的P2P的世界。通過一個實例,說明WCF中使用P2P。

??? 首先讓我們了解一下什么是P2P。詳細見:P2P。這里根據(jù)我的理解,結(jié)合WCF簡單的敘述一下。一般使用WCF,客戶端與客戶端交互都要使用一個服務(wù)端作為中間站。客戶端將數(shù)據(jù)傳遞給服務(wù)端,服務(wù)端再轉(zhuǎn)發(fā)給其他的客戶端。很明顯,這顯然加重了服務(wù)端的負擔(dān)。P2P是解決這個問題的。每一個客戶端既可以是接受數(shù)據(jù)的客戶端,又是上傳數(shù)據(jù)的服務(wù)端。用過PPS和迅雷的童鞋就能很容易的理解了,這兩個軟件既要上傳數(shù)據(jù),又要下載數(shù)據(jù)。看下面兩幅圖:

?

圖一:圍繞中心服務(wù)器打轉(zhuǎn)

?

圖二:P2P分布

實例的功能

??? 我實現(xiàn)的這個例子的功能是:在一個局域網(wǎng)內(nèi),有很多臺電腦。當(dāng)其中一臺電腦實現(xiàn)了復(fù)制或者剪貼,在其他的電腦上將顯示復(fù)制和剪貼的數(shù)據(jù)。你可以實現(xiàn)Ctrl+C或者Ctrl+X進行數(shù)據(jù)復(fù)制或者剪貼。在其他的電腦上有一個窗體專門顯示你復(fù)制或者剪貼的數(shù)據(jù)(限定了文本數(shù)據(jù))。

??? 實現(xiàn)這個程序有兩個難點:

??? 1、如何監(jiān)聽Ctrl+C或者Ctrl+X等事件

??? 2、不需要特定的服務(wù)端(不通過WCF的雙工通信),如果通過P2P去實現(xiàn)數(shù)據(jù)通信。

實例的實現(xiàn):

??? 下面根據(jù)這兩個難點來展開去實現(xiàn)。

?? 一、事件監(jiān)聽:

??? 1、在WindowsForm應(yīng)用程序中,protected override void WndProc(ref System.Windows.Forms.Message m)方法可以供我們?nèi)ブ剌d來實現(xiàn)事件的監(jiān)聽。判斷Message的編號,如果是復(fù)制或者剪貼事件。我們就去通過WCF的P2P服務(wù)來廣播剪貼板中的信息。代碼如下:

protected override void WndProc(ref System.Windows.Forms.Message m){// defined in winuser.hconst int WM_DRAWCLIPBOARD = 0x308;const int WM_CHANGECBCHAIN = 0x030D;switch (m.Msg){case WM_DRAWCLIPBOARD:DisplayClipboardData();SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;case WM_CHANGECBCHAIN:if (m.WParam == nextClipboardViewer)nextClipboardViewer = m.LParam;elseSendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;default:base.WndProc(ref m);break;}}

??? 2、然后提交給User32.dll處理:

[DllImport("User32.dll")]protected static extern int SetClipboardViewer(int hWndNewViewer);[DllImport("User32.dll", CharSet = CharSet.Auto)]public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

??? 通過上面的代碼,我們解決了第一個問題:如何監(jiān)聽Ctrl+C或者Ctrl+X等事件。

???? 二、在WCF中,我們要通過NetPeerTcpBinding實現(xiàn)P2P。

???? 下面我就一步一步的實現(xiàn)這個P2P的應(yīng)用服務(wù)。

??? 1、定義契約和實現(xiàn)契約:

[ServiceContract(CallbackContract = typeof(IShare))]public interface IShare{[OperationContract(IsOneWay = true)]void ShareClipboard(string type,string message);} public class ShareImplementation : IShare{private static Form m_receiverForm;private static ClipEventHandler m_OnClipReceive;public void ShareClipboard(string type,string message){try{m_receiverForm.Invoke(m_OnClipReceive, type, message);}catch (Exception e){MessageBox.Show(e.ToString());}}public void SetForm(Form form,ClipEventHandler theCallback){m_receiverForm = form;m_OnClipReceive = theCallback;}}使用一個類來管理這個服務(wù): public class Peer{public string Id { get; private set; }public IShare Channel;public ShareImplementation Host;public ClipEventHandler clipeventhandler;public Form form;public Peer(string id){Id = id;}private DuplexChannelFactory<IShare> _factory;public void StartService(){var binding = new NetPeerTcpBinding();binding.Security.Mode = SecurityMode.None;var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IShare)),binding,new EndpointAddress("net.p2p://SimpleP2P"));Host = new ShareImplementation();Host.SetForm(form,clipeventhandler);_factory = new DuplexChannelFactory<IShare>(new InstanceContext(Host), endpoint);var channel = _factory.CreateChannel();((ICommunicationObject)channel).Open();// wait until after the channel is open to allow access.Channel = channel;}public void StopService(){((ICommunicationObject)Channel).Close();if (_factory != null)_factory.Close();}private readonly AutoResetEvent _stopFlag = new AutoResetEvent(false);public void Run(){Console.WriteLine("[ Starting Service ]");StartService();Console.WriteLine("[ Service Started ]");_stopFlag.WaitOne();Console.WriteLine("[ Stopping Service ]");StopService();Console.WriteLine("[ Service Stopped ]");}public void Stop(){_stopFlag.Set();}}

在WindowsForm中,通過DisplayClipboardData()方法來調(diào)用此服務(wù),代碼如下。

void DisplayClipboardData(){try{IDataObject iData = new DataObject();string type = "",message="";iData = Clipboard.GetDataObject();if (Clipboard.ContainsText()){message = (string)iData.GetData(DataFormats.Text);}if (peer != null && peer.Channel != null){peer.Channel.ShareClipboard("text", message);}}catch (Exception e){MessageBox.Show(e.ToString());}}

還有就是一個方法來接受信息方法AddToClip,代碼如下:

public void AddToClip(string type, string message){if (type == "rtf"){IDataObject iData = new DataObject(DataFormats.Rtf, message);richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);//richTextBox1.Rtf = message;}else if (type == "text")richTextBox1.Text = message;elserichTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";richTextBox1.Text = message;}

由于WCF得回調(diào)和WindowsForm的主線程不是一個,故使用了一個委托:

public delegate void ClipEventHandler(string type ,string clipData);

其他詳細見代碼。

實例的效果:

??? 在電腦zhuqilin上復(fù)制文本數(shù)據(jù)

?? 在電腦Colin上顯示zhuqilin上復(fù)制的數(shù)據(jù):

總結(jié):

????? 上星期用WCF的雙工實現(xiàn)了一個音頻聊天室的程序。有園友提出點對點的視頻、語音、聊天用P2P去實現(xiàn)效率和性能更好,故研究了一下WCF的P2P。本文就是一個簡單的WCF的P2P的例子。

擴展:

??? 這篇文章只實現(xiàn)了文字剪貼板的共享功能。如果你有興趣,可以進一步擴展。

??????? 擴展1:數(shù)據(jù)直接傳遞到其他電腦的剪貼板上,可以直接Ctrl+V粘貼。

??????? 擴展2:現(xiàn)在只是實現(xiàn)文字剪貼板的共享。擴展成文件、視頻、圖片都可以。

??? 效果可以是:如果局域網(wǎng)的兩個端點機器通過共享自己的剪貼板。在A機器上復(fù)制文件,在B機器上可以直接粘貼。

??? 寫這個例子的靈感來自RealVNC。用過RealVNC的童鞋都知道,無論局域網(wǎng)還是外網(wǎng),只要兩臺pc建立連接,就能共享剪貼板上的數(shù)據(jù)了。

最后:建立P2P和打開P2P管道需要時間,故在運行這個程序的之后,需要等上一段時間才能共享你的剪貼板。如果有建議請留言,有幫助請推薦。thx。

代碼:http://files.cnblogs.com/zhuqil/ShareClipboard.rar



(全文完)


以下為廣告部分

您部署的HTTPS網(wǎng)站安全嗎?

如果您想看下您的網(wǎng)站HTTPS部署的是否安全,花1分鐘時間來 myssl.com 檢測以下吧。讓您的HTTPS網(wǎng)站變得更安全!

SSL檢測評估

快速了解HTTPS網(wǎng)站安全情況。

安全評級(A+、A、A-...)、行業(yè)合規(guī)檢測、證書信息查看、證書鏈信息以及補完、服務(wù)器套件信息、證書兼容性檢測等。

SSL證書工具

安裝部署SSL證書變得更方便。

SSL證書內(nèi)容查看、SSL證書格式轉(zhuǎn)換、CSR在線生成、SSL私鑰加解密、CAA檢測等。

SSL漏洞檢測

讓服務(wù)器遠離SSL證書漏洞侵擾

TLS ROBOT漏洞檢測、心血漏洞檢測、FREAK Attack漏洞檢測、SSL Poodle漏洞檢測、CCS注入漏洞檢測。

轉(zhuǎn)載于:https://www.cnblogs.com/zhuqil/archive/2010/06/20/wcf-p2p-demo.html

總結(jié)

以上是生活随笔為你收集整理的利用WCF的P2P共享剪贴板上的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。