WCF与P2P

WCF是用来实现数据通信的,这篇文章中。我将带领大家进入WCF的P2P的世界。通过一个实例,说明WCF中使用P2P。

首先让我们了解一下什么是P2P。详细见:P2P。这里根据我的理解,结合WCF简单的叙述一下。一般使用WCF,客户端与客户端交互都要使用一个服务端作为中间站。客户端将数据传递给服务端,服务端再转发给其他的客户端。很明显,这显然加重了服务端的负担。P2P是解决这个问题的。每一个客户端既可以是接受数据的客户端,又是上传数据的服务端。用过PPS和迅雷的童鞋就能很容易的理解了,这两个软件既要上传数据,又要下载数据。看下面两幅图:

图一:围绕中心服务器打转

图二:P2P分布

实例的功能

我实现的这个例子的功能是:在一个局域网内,有很多台电脑。当其中一台电脑实现了复制或者剪贴,在其他的电脑上将显示复制和剪贴的数据。你可以实现Ctrl+C或者Ctrl+X进行数据复制或者剪贴。在其他的电脑上有一个窗体专门显示你复制或者剪贴的数据(限定了文本数据)。

实现这个程序有两个难点:

1、如何监听Ctrl+C或者Ctrl+X等事件

2、不需要特定的服务端(不通过WCF的双工通信),如果通过P2P去实现数据通信。

实例的实现:

下面根据这两个难点来展开去实现。

一、事件监听:

1、在WindowsForm应用程序中,protected override void WndProc(ref System.Windows.Forms.Message m)方法可以供我们去重载来实现事件的监听。判断Message的编号,如果是复制或者剪贴事件。我们就去通过WCF的P2P服务来广播剪贴板中的信息。代码如下:

        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);

通过上面的代码,我们解决了第一个问题:如何监听Ctrl+C或者Ctrl+X等事件。

二、在WCF中,我们要通过NetPeerTcpBinding实现P2P。

     下面我就一步一步的实现这个P2P的应用服务。

1、定义契约和实现契约:

   [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;}}使用一个类来管理这个服务:
    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()方法来调用此服务,代码如下。

        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得回调和WindowsForm的主线程不是一个,故使用了一个委托:

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

其他详细见代码。

实例的效果:

在电脑zhuqilin上复制文本数据

在电脑Colin上显示zhuqilin上复制的数据:

总结:

上星期用WCF的双工实现了一个音频聊天室的程序。有园友提出点对点的视频、语音、聊天用P2P去实现效率和性能更好,故研究了一下WCF的P2P。本文就是一个简单的WCF的P2P的例子。

扩展:

这篇文章只实现了文字剪贴板的共享功能。如果你有兴趣,可以进一步扩展。

扩展1:数据直接传递到其他电脑的剪贴板上,可以直接Ctrl+V粘贴。

扩展2:现在只是实现文字剪贴板的共享。扩展成文件、视频、图片都可以。

效果可以是:如果局域网的两个端点机器通过共享自己的剪贴板。在A机器上复制文件,在B机器上可以直接粘贴。

写这个例子的灵感来自RealVNC。用过RealVNC的童鞋都知道,无论局域网还是外网,只要两台pc建立连接,就能共享剪贴板上的数据了。

最后:建立P2P和打开P2P管道需要时间,故在运行这个程序的之后,需要等上一段时间才能共享你的剪贴板。如果有建议请留言,有帮助请推荐。thx。

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

(全文完)


以下为广告部分

您部署的HTTPS网站安全吗?

如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

SSL检测评估

快速了解HTTPS网站安全情况。

安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

SSL证书工具

安装部署SSL证书变得更方便。

SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

SSL漏洞检测

让服务器远离SSL证书漏洞侵扰

TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

转载于:https://www.cnblogs.com/zhuqil/archive/2010/06/20/wcf-p2p-demo.html

利用WCF的P2P共享剪贴板上的数据相关推荐

  1. 【视频教程】利用Excel轻松爬取网页上的数据

    说到从网上抓取数据,大多数人马上想到的就是Python,但是有的时候不用Python也可以搞定.今天给大家分享一篇如何利用Excel抓取网站上我们所需要的多页数据. 如抓取新浪财经股票页面中的2019 ...

  2. 计算机通过路由器连接打印机共享的打印机,如何利用无线路由器进行打印机共享访问操作...

    如何利用无线路由器进行打印机共享访问操作 随着无线网络的快速发展,其应用的范围更加的广阔.现在不少单位已经开始使用无线网络了,在该无线网络环境中虽然我们也可以非常轻松地进行文件夹共享访问操作,但是要想 ...

  3. 【转】利用WCF的双工通信

    Silverlight与WCF之间的通信(2)利用WCF的双工通信"推送"给SL数据 作者:Leon Weng  来源:博客园  发布时间:2010-06-19 23:43  阅读 ...

  4. C#利用WCF改进文件流传输的三种方式

    摘要:本文介绍C#利用WCF改进文件流传输的三种方式:MTOM模型.基于同步传输的异步回调模型.基于异步传输的异步模型,并提供相应的实现代码供参考. - WCF在跨域传输使用了两种模型的方法调用:一种 ...

  5. 多电脑共享键鼠,传输数据,共享剪贴板

    共享键鼠: 目的:要能鼠标键盘稳定切换电脑 传输数据 剪切板 usb切换器 不能数据传输 价格较贵 但可以实现多于两台电脑的共享键鼠 usb对拷线 优点:传输速度快(5G大概20秒),共享键鼠,共享剪 ...

  6. 基于QT的一款P2P共享文件系统

    软件下载地址 : 基于QT的一款P2P共享文件系统 Github地址 软件环境: QT5.4.x, mysql5 准备工作:需要启动mysql服务,并建立ShareFile数据库,建如下两张数据表: ...

  7. 【ditto】win10局域网多设备共享剪贴板

    文章目录 前言 剪贴板历史 多设备局域网共享剪贴板 前言 你是否遇到过这样的问题? 第一次复制的内容被第二次复制内容覆盖,导致想回去找之前复制的内容需要重新复制一遍? 身边有两台以上的电脑,在某个电脑 ...

  8. WCF服务重构实录(上)

    项目需求 之前的项目中采用了WCF,绑定模式选择的是netTcpBinding,宿主选择了控制台方式,主要考虑两方面优点: 方便管理宿主的生命周期 提升服务性能 但是在实际的开发过程中产生了许多问题, ...

  9. Python实现向s3共享存储上传和下载文件

    Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...

最新文章

  1. Ubuntu16.04运行.run文件
  2. Cuckoo hash算法分析——其根本思想和bloom filter一致 增加hash函数来解决碰撞 节省了空间但代价是查找次数增加...
  3. eventbus使用_Android EventBus框架的使用介绍
  4. 为什么要进行透明计算和透明计算是什么
  5. 为什么要娶就娶电力女?!
  6. linux 定时执行kettle6,linux下使用crond定时执行kettle的job
  7. 建立在Windows XP欢迎屏幕中隐藏的用户
  8. mit数据集_MIT的DNN硬件加速器教程(二)流行的DNN和数据集
  9. 第15届Pwn2Own大赛确定目标和奖金
  10. android 中LayoutInflater 的使用
  11. 希尔排序java代码_希尔排序及希尔排序java代码
  12. Libev源码分析07:Linux下的eventfd简介
  13. python不用sort排序_Python排序方法sort、sorted的key参数的作用
  14. 190321每日一句
  15. 显示器提示超频的解决办法
  16. Eric6与pyqt5学习笔记14 【实战5 百度贴吧离线签到工具】
  17. 磁带存储发展趋势浅析
  18. 宝塔如何使用一个IP地址建立多个站点
  19. 解决HTML显示中文乱码问题
  20. make[2]: *** [/home/nnnn/calibration/devel/lib/libcalibrationtoolkit.so] Error 1

热门文章

  1. 《梁启超家书》笔记三——交友取益,或读书取益,也要方面稍多,才有接谈交换,或开卷引进的机会
  2. 百度名词~杂篇--(对日常遇到事物的深入了解)
  3. Java Map以及HashMap、TreeMap、HashTable
  4. 一加手机刷机 Kali Nethunter
  5. Metal 框架之从可绘制纹理中读取像素数据
  6. 【论文阅读】Multi-Modal Sarcasm Detection 图文反讽识别
  7. 双线性汇合(bilinear pooling)在细粒度图像分析及其他领域的进展综述
  8. 华硕笔记本k555拆机图解_华硕(ASUS)K54HR笔记本拆机清灰图解
  9. 黑苹果 服务器系统安装教程,黑苹果安装教程,详细教您黑苹果怎么安装
  10. 第87篇ES之Elastica-php匹配多值字段及给Problem的elementName设中文分词ik