`
wsql
  • 浏览: 12104420 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

阅读更多
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能取得辉煌的发展。


分享到:
评论

相关推荐

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

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

    c#实现voicechat_p2p点对点语音对讲程序.rar

    综上所述,"c#实现voicechat_p2p点对点语音对讲程序.rar"这个项目涵盖了C#与Windows音频系统交互、音频编码解码、网络编程等多个技术领域,是学习和实践这些技术的一个良好平台。通过深入理解并实现这个程序,开发者...

    c#点对点P2P聊天软件

    综上所述,"c#点对点P2P聊天软件"的开发涵盖了C#编程基础、网络通信、多线程编程、UI设计、数据交换以及安全性等多个方面,是一个综合性的项目,能帮助开发者全面掌握多种技术。在mychat1这个项目文件中,包含了实现...

    C# p2p点对点聊天

    在本文中,我们将深入探讨如何使用C#编程语言构建一个P2P(点对点)聊天应用程序。P2P网络架构允许用户之间直接通信,无需通过中心服务器,从而提供了更高效、灵活的通信方式。 首先,理解P2P网络的基本原理至关...

    用C#实现点对点聊天

    本项目“用C#实现点对点聊天”旨在通过TCP/IP协议创建一个简单的点对点通信系统,使得两个用户能够进行实时聊天。TCP/IP协议是互联网通信的基础,确保了数据的可靠传输。 点对点(P2P)通信模型不同于传统的客户端-...

    c#实现p2p点对点的信息传输

    通过以上分析,我们可以看到利用C#实现P2P点对点的信息传输主要涉及Socket编程、TCP协议、多线程处理等方面的技术。在实际开发过程中,还需要考虑到错误处理、安全性以及可扩展性等问题。此外,随着技术的发展,还...

    c# 实现p2p通信,c#p2p局域网聊天源码

    在本文中,我们将深入探讨如何使用C#语言实现P2P(点对点)通信,特别是在局域网环境中创建一个简单的聊天应用。P2P通信是一种网络架构,其中每个节点既是客户端也是服务器,允许直接的数据交换。对于初学者来说,...

    P2P点对点聊天(c#开发)

    P2P点对点聊天系统是一种基于P2P(Peer-to-Peer)网络技术的通信方式,用户之间可以直接交换信息,无需通过中心服务器。在C#中开发这样的系统,需要理解并掌握以下关键知识点: 1. **P2P网络原理**:P2P网络中的每...

    C#中使用异步Socket实现点对点通信

    在C#编程中,利用异步Socket实现点对点(P2P)通信是一种常见的网络编程技术,可以创建高效、可扩展的网络应用。异步Socket编程的核心在于它允许程序在执行其他操作的同时处理网络I/O,提高了程序的响应性和整体性能...

    c# P2P的使用,TCP,点对点聊天,群发,文件发送

    在这个场景下,我们将讨论如何在C#中利用TCP(Transmission Control Protocol)实现P2P的点对点聊天、群发消息以及文件发送功能。 首先,我们需要理解TCP协议。TCP是一种面向连接的、可靠的传输层协议,它保证了...

    p2p聊天程序(c#)

    【标题】"p2p聊天程序(c#)"揭示了我们要探讨的核心主题:使用C#编程语言构建一个点对点(P2P)聊天应用。P2P网络是一种网络架构,其中每个节点(或用户)都可以作为服务的提供者和消费者,与传统客户端-服务器模式...

    C# 简单点对点聊天

    本项目"DotAndDotCose"就是使用C#实现的一个简单点对点聊天系统,适用于学习和理解P2P通信的基本原理。 在C#中实现点对点聊天,主要涉及以下几个核心知识点: 1. **套接字编程**:C#的System.Net.Sockets命名空间...

    P2P点对点聊天 源码

    总结,P2P点对点聊天系统利用C#编程语言和P2P技术实现了局域网内的即时通讯,其源码揭示了网络通信、节点发现、数据传输等关键环节的实现细节。通过对源码的深入理解和实践,开发者可以更好地掌握P2P网络编程和C#的...

    P2P点对点聊天系统

    《P2P点对点聊天系统详解》 点对点(P2P)聊天系统是一种基于互联网的通信模式,它允许用户之间直接进行通信,无需通过中心服务器作为中介。这种技术在即时通讯软件、文件共享等领域广泛应用。本系统采用C#编程语言...

    C#P2P聊天软件

    【C# P2P聊天软件】是一个基于C#编程语言实现的点对点通信系统,它允许用户之间直接进行实时的聊天交流。P2P(Peer-to-Peer)技术是互联网通信的一种架构,其中每个参与者既是客户端也是服务器,无需通过中心服务器...

    P2P聊天室 C#

    在C#中,我们可以使用System.Net命名空间下的类来实现P2P通信。例如,使用Socket类创建并管理网络连接,使用IPAddress和IPEndPoint类来表示IP地址和端口号,使用TcpClient和TcpListener类进行TCP连接的建立与监听。 ...

    p2p点对点聊天C#源码

    【P2P点对点聊天C#源码】是一个基于C#编程语言实现的聊天应用程序,它利用了P2P(Peer-to-Peer)技术,实现了用户之间直接通信的功能,无需通过中央服务器作为中介。这种架构的优势在于它可以降低服务器压力,提高...

    C#点对点聊天

    在本文中,我们将深入探讨如何使用C#编程语言构建一个点对点聊天应用程序,以及如何实现窗口震动功能。C#是一种强大的、面向对象的编程语言,由微软开发,广泛应用于Windows桌面应用、游戏开发和服务器端编程。点对...

    c# p2p聊天室工具

    在本文中,我们将深入探讨如何使用C#编程语言来实现一个点对点(P2P)聊天室工具。点对点通信是一种网络架构,其中每个参与者(或节点)可以直接与其他节点进行通信,而无需通过中央服务器。这种模式在即时通讯应用...

    C# 基于Directshow的p2p视频聊天系统

    为了实现视频聊天,还需要处理以下关键技术点: 1. **视频编码与解码**:为了在网络上传输,原始视频数据需要经过压缩编码。常见的视频编码标准有H.264、VP8和AV1等。编码后的数据在接收端再进行解码,恢复成原始...

Global site tag (gtag.js) - Google Analytics