本站业务范围:1、PC端软件开发、网站开发 2、移动端APP、网站、微信接口、微商城开发 3、视频教程、课程设计和辅导 4、单片机开发 5、串口通讯调试
 当前位置:文章中心 >> Winform/客户端程序
立即购买视频教程 C#版P2P技术实现点对点聊天
夜鹰教程网 来源:www.yyjcw.com 日期:2016-12-1 11:37:35
P2P,英文Peer-to-Peer的缩写,中译为对等互联或点对点技术。P2P技术可以让用户可以直接连接到其他用户的计算机,进行文件共享与交换,同时P2P在深度搜索、分布计算、协同工作等方面也大有用途。 

这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



P2P技术简介

 

  P2P,英文Peer-to-Peer的缩写,中译为对等互联或点对点技术。P2P技术可以让用户可以直接连接到其他用户的计算机,进行文件共享与交换,同时P2P在深度搜索、分布计算、协同工作等方面也大有用途。

  简单地说,P2P就是一种用于不同PC用户之间,不经过中继设备直接交换数据或服务的技术,它允许Internet用户直接使用对方的文件。每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。

  目前Internet的存储模式是"内容位于中心",而P2P技术的运用将使Internet上的内容向边缘移动。这将带来以下改变:

  首先,客户不再需要将文件上传到服务器,而只需要使用P2P与其他计算机进行共享;

  其次,使用P2P技术的计算机不需要固定的IP地址和永久的Internet连接,这使得占有极大比例的拨号上网用户也可以享受P2P带来的变革。

 实例介绍

  理解P2P技术的最好方法莫过于仔细观察并理解一个实际的P2P应用程序。C#作为微软.Net战略的重要棋子,对网络编程提供了很好的支持和优化。本文就通过一个程序,向大家介绍一下C#下的P2P编程的方法和实现机理。本文的这个程序不是很有用,但却很直观地给出了P2P(点对点)编程以及套接口编程的一些基本知识和概念。它是建立在TcpListener以及TcpClient这两个类基础上的。程序实现的原理也比较简单,但是用到了P2P技术重返"非中心化"的基本原则。简言之,用这个程序可以在网络中发送、接受消息,任何一台计算机既可以作为服务器端,又可以作为客户端。

  系统要求:

  1.Widows 2000服务器版操作系统或后续版本的操作系统。

  2.Visual Studio.net Framework正式版。

  具体方法:

  首先,打开VS.net,新建一个C#项目(注意:模板为Windows应用程序),不妨命名为"P2Pchat"。图示如下:

  其次,参照ICQ、OICQ等聊天工具,我们可以将程序的主界面布置成和常见聊天工具的消息发送对话框类似的布局。不过由于程序仅一个主界面,所以还要添加一些诸如"开始监听"、"停止监听"等控制按钮。同时,程序是支持昵称显示的。于是,按照这个思想,我们可以开始布置程序的主界面了。首先,往主界面上拖放如下一些控件:两个Label控件、三个Button控件、三个TextBox控件、一个RichTextBox控件以及一个StatusBar控件。

各个控件的属性设置如下表所示:

 

Form1 Text属性 P2P聊天工具
Label1 Text属性 目标计算机地址:
TestSlign属性 MiddleCenter
Label2 Text属性 昵称:
TextAlign属性 MiddleCenter
Button1 Text属性 开始监听
FlatStyle属性 Flat
Button2 Text属性 停止监听
FlatStyle属性 Flat
Enabled属性 False
Anchor属性 Top, Right
Button3 Text属性 发送消息
FlatStyle属性 Flat
Anchor属性 Top, Right
TextBox1 Text属性 (空)
Anchor属性 Top, Left, Right
TextBox2 Text属性 (空)
Multiline属性 True
Anchor属性 Top, Left, Right
TextBox3 Text属性 (空)
ForeColor属性 Firebrick
Anchor属性 Top, Left, Right
RichTextBox1 Text属性 (空)
ForeColor属性 Steelblue
ReadOnly属性 True
Anchor属性 Top, Bottom, Left, Right

 

  注:其中的Anchor属性是设置窗体上控件布局用的,当窗体大小改变后各个控件如何在窗体上重新分布由该属性决定,读者可参考更详细的介绍文章来理解。

  其他属性为默认即可,最终布置主窗体界面如下所示:

  现在到了程序的主体部分,即代码部分。在给出代码之前,我想先向大家介绍一下实现的基本原理以及其中的一些逻辑关系。

 首先,程序运行后,用户得先按下“开始监听”按钮,按钮相应事件后,程序就进入了监听状态,状态栏有相应的显示。这样,本机就相当于“服务器/客户机”模式中的服务器了,其他计算机可以连接到本机并向本机发送消息。其他计算机通过该程序连接到本机是通过IP地址来实现的,C#对网络编程有很好的支持,所以程序员的工作量是比较小的。如此,一台计算机可以向另一台发送消息了。然而,这是个P2P程序,所以只要另一台计算机的用户也按下"开始监听"按钮,那台计算机也成了这台计算机的服务器了。于是就实现了消息互发功能,然而真正的服务器是不存在的,每台计算机都是服务器,每台计算机同时也是客户机,这就体现了P2P技术的"非中心化"原则。

  程序主要用到了一个Listen()函数和一个Send()函数。前者实现程序的监听功能,函数实现如下:

private void Listen()try
      
{
            tcpl 
= new TcpListener(5656); 
       tcpl.Start();
          statusBar1.Text 
= "正在监听"; 
             
while(listenerRun)
         
{
              Socket s 
= tcpl.AcceptSocket();
              Byte[] stream 
= new Byte[80];
               
int i=s.Receive(stream) ;
               
string message =
System.Text.Encoding.UTF8.GetString(stream);
             richTextBox1.AppendText(message);
            }

      }

    
catch(System.Security.SecurityException)
      
{
   MessageBox.Show(
"防火墙安全错误!","错误",
        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
      }

    
catch(Exception)
        
{
          statusBar1.Text 
= "已停止监听!"
    }

}

  函数的主体是一个try-catch语句,try部分又是一个while循环,这表示只要用户不按"停止监听"按钮,程序就会一直处于监听状态。监听的端口是5656,这个端口是可以自己定义的,只要不跟常用的端口混淆就行了。一旦程序接收到远程计算机的一条消息,就将该消息添加到消息显示框中(消息显示框就是那个RichTextBox控件)。函数的catch部分是捕捉一些异常用的,如用户之间设置了防火墙,就不能彼此通讯了,或是对方已经停止监听了,那当然就不能向它发送消息了。另一个函数Send()是实现程序发送消息的功能的。函数实现如下:

private void Send()
{
     
try
       
{
           
string msg = "<"+textBox3.Text+">"+textBox2.Text;
          TcpClient tcpc 
= new TcpClient(textBox1.Text, 5656);
          NetworkStream tcpStream 
= tcpc.GetStream(); 
StreamWriter reqStreamW 
= new StreamWriter(tcpStream);
         reqStreamW.Write(msg);
           reqStreamW.Flush();
           tcpStream.Close();
           tcpc.Close();
        richTextBox1.AppendText(msg); 
          textBox2.Clear();
       }

       
catch(Exception)
        
{
             statusBar1.Text 
= "目标计算机拒绝连接请求!"; 
     }

}


  该函数的主体部分也是一个try-catch语句,它先根据用户的输入,建立一个和远程计算机的连接,注意其端口也为5656,而且必须是5656,这是为了和接收方端口保持一致,这样对方才能收到这里发送的消息。接着,函数根据用户在消息输入框中的内容以及用户的昵称向远程计算机发送消息。这样,只要网络无故障、远程计算机已经处于监听状态,它就能接收到这里发送的消息了。当然,这里处于监听状态了,远程的计算机也可以自如地往这里发消息。函数的catch部分也是用于捕捉一些异常的。

  同时还要注意的是,由于该程序用到了许多网络编程所需的对象以及输入输出对象,又运用了多线程编程机制,所以在程序的开始出得添加如下一些名字空间:

  using System.IO;
  
using System.Net.Sockets;
  
using System.Threading;

  最后,程序中各个控件的事件处理函数以及完整的代码请参看文后附带的源代码包。程序运行的图示如下:

  现在一个很基本的P2P运用程序以及完成,通过它,我们可以利用P2P技术的基本特性实现点对点通信。通过这个程序,我相信大家对C#下的P2P编程应该有了大致的了解。对于这个程序,不足的一点是功能比较简单,只可以发送、接受信息,而且不能穿过防火墙进行通讯,读者可以试着开发出功能更强P2P应用程序。

  总结

  最后,笔者希望能通过此文唤起大家对P2P技术的兴趣。因为P2P身后所蕴藏着的无比的创造力使人们对未来互联网充满了美好的憧憬,现在世界范围的P2P应用热潮也是一浪高过一浪。在可以预见的未来,随着对P2P研究的进一步深入和关注P2P的群体逐渐增多,P2P必将进入一个飞速发展的新时期。然而国内的P2P起步得比较晚,所以更需要有大量的技术研究投入以及足够的重视以赢得更好的发展。在此,笔者希望国内的P2P能取得辉煌的发展。

复制链接 网友评论 收藏本文 关闭此页
上一条: HTTP请求详解  下一条: 如何实现广域网通讯p2p(c#)
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  推荐教程/优惠活动

  热门服务/教程目录

  夜鹰教程网  新手必看,详细又全面。
  夜鹰教程网  购买教程  夜鹰教程网  在线支付-方便
  夜鹰教程网  担保交易-快捷安全   夜鹰教程网  闪电发货
  夜鹰教程网  电话和QQ随时可以联系我们。
  夜鹰教程网 不会的功能都可以找我们,按工作量收费。

客服电话:153 9760 0032

购买教程QQ:1416759661  
  热点推荐
破解封路由的方法详解
技巧篇:只用这一招就能拒绝全部的…
挂马方法和技巧大汇总
网络安全防护:如何防止远程入侵
如何解决:系统开机就弹出广告网页…
彻底防御U盘病毒
安全配置交换机端口提高网络安全性…
浅析网络安全审计原理和技术(2)
用U盘就可以去除win XP管理员密码…
电脑硬盘各逻辑盘用鼠标左键双击它…
详解网站挂马的手段
新手认识;网银账号相关知识
ARP欺骗和ICMP欺骗催生全新DOS工具…
浅析网络安全审计原理和技术(1)
木马最基本的隐藏:不可见窗体和隐…
  尊贵服务
夜鹰教程网 承接业务:软件开发 网站开发 网页设计 .Net+C#+VS2008+MSsql+Jquery+ExtJs全套高清完整版视频教程
  最近更新
.NET C# 和Java开发人员岗位切换
模拟登录人人网
HttpWebRequest以及HttpWebRespon…
HttpClient使用说明
Winform为Combobox树添加数据
C#之允许DataGridView选中整行
C#中DataGridView只能选择一行禁止…
为自动填充列调整大小期间不能执行…
c# winform设置listBox如何设置te…
c#的委托(代理)和事件
C# Task 任务计划
C# socket 多线程多管道可断点传送…
让ListBox的滚动条滚动到最底部
c#用事件模式实现通知
什么是异步编程,为什么会需要异…
  工具下载  需要远程协助? 

sql2008视频教程 c#视频教程

VIP服务:如果您的某个功能不会做,可以加我们QQ,给你做DEMO!

JQUERY  Asp.net教程

MVC视频教程  vs2012
.NET+sql开发
手机:15397600032 C#视频教程下载
微信小程序 vue.js高级实例视频教程

教程咨询QQ:1416759661


这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



关于我们 | 购买教程 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3