首先,程序运行后,用户得先按下“开始监听”按钮,按钮相应事件后,程序就进入了监听状态,状态栏有相应的显示。这样,本机就相当于“服务器/客户机”模式中的服务器了,其他计算机可以连接到本机并向本机发送消息。其他计算机通过该程序连接到本机是通过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能取得辉煌的发展。

北京思源培训中心---C#下用P2P技术实现点对点聊天(2)相关推荐

  1. C#下用P2P技术实现点对点聊天

    .NET将关于多线程的功能定义在System.Threading名字空间中.因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;). 即使你没有编写多线程应用程 ...

  2. 北京智源大会 | AI 产业下个十年中的大变量

    整理:常政.王炜强.贾伟 2020年6月22日晚,在第二届北京智源大会晚间圆桌论坛上,智源研究院四位理事单位的相关负责人"云上相聚",围绕"人工智能产业的下一个十年&qu ...

  3. 金融数据中心环境下的SDN技术评测标准化思考与实践

    声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载. 作者:中国银联电子商务与电子支付国家工程实验室SDN研究团队.上海银行信息技术部网络管理团队. 责编:钱曙光,关注架构和算法领域,寻求 ...

  4. Linux下Socket网络编程之点对点聊天室

    1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...

  5. 区块链创新论坛成“京交会”新亮点:思源推出创新区块链解决方案

    用"区块链政务解决方案"解决跨部门协同和数据共享互认问题,助力"一网通办",让市民.企业办事少跑腿:用"区块链教育解决方案"解决学生学历学位 ...

  6. 中科院计算所职业培训中心2014年四季度课程安排

    中科院计算所培训中心成立于1987年,是计算所根据国家普及计算机知识,培养专业计算机人才而创建的.培训中心依托中国科学院强大的技术背景,历经二十年的发展,为全国各企事业单位.部队.院校等累计培养了近十 ...

  7. 中科院计算所培训中心举办【人工智能的计算机工程】企业内部培训

    随着时代的不断发展,"人工智能"这个熟悉又陌生的词汇已经走进了我们生活的方方面面.为了使企业人员更加深入地学习和分享前沿技术知识,2019年1月4日上午,中科院计算所培训中心全体人 ...

  8. AI:2020北京智源大会与五位图灵奖得主和100多位专家《共同探讨人工智能的下一个十年》——6月21日~6月24日的日程安排(实时更新,建议收藏)

    AI:2020北京智源大会与五位图灵奖得主和100多位专家<共同探讨人工智能的下一个十年>--6月21日~6月24日的日程安排(实时更新,建议收藏) 导读:2020年,是一个十年的结束,也 ...

  9. educoder平台哪里有答案_昆山哪里有雅思6分培训中心哪些专业

    昆山哪里有雅思6分培训中心哪些专业 如今培训机构品牌繁多, 报名前大家都会认真对比和参考,关于培训机构哪家好,谁也不能给出的标准答案,因为每个人的评判标准不一样,还是要看个人选择了.机构的师资实力都不 ...

最新文章

  1. 定义主程序matlab,MATLAB 主程序和子程序之间的问题 子程序出错
  2. Linux rpm 命令参数
  3. 几种作图软件使用感言
  4. Django 【补充】ORM多对多正向查询
  5. 消防信号总线原理_消防报警系统中消防模块分类与用途简介
  6. Python入门学习笔记(8)
  7. 专访 | 「Smartbi 」VP徐晶:未来,BI将成为决策者的诸葛亮
  8. MP288MP280清零软件
  9. Windows 必备纯净软件
  10. 2021年下半年系统集成项目管理工程师下午真题及答案解析
  11. Windows10下载CUDA总是下载失败的解决方案
  12. 通过搜狗搜索爬取微信公众号文章,小程序版可体验
  13. 软件测试——透过表象看本质
  14. 阿里腾讯裁员、最高30%?计算机行业前景到底如何...
  15. 【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?
  16. Say Hello to Integers (Java)
  17. BZOJ2716天使玩偶
  18. win10隐藏正在运行的程序怎么操作_win10怎么隐藏正在运行的软件
  19. QPushButton去掉虚线框(焦点框)
  20. bootstrap表单验证

热门文章

  1. React UI 库 React Suite 3.7.9 版本更新
  2. 线程池----ThreadPoolExecutor
  3. web前端基础知识-(六)jQuery-补
  4. 安装更新Lenovo Solution Center更新失败!具体问题看内容!要是等官方技术人员解决,估计要等上好一段时间!...
  5. Linux 命令(106)—— chkconfig 命令
  6. Shell 条件表达式的正则匹配
  7. C++ 模板实例化与调用
  8. A*算法及其matlab实现
  9. linux 进程的 5 大段
  10. svn与eclipse的集成(第三方插件与eclipse的集成)