c#实现p2p点对点信息简单教程

}其实可以看成是一种对等的网络模型。 p2p 其实是实现网络上不同计算机之间,点对点即 peer-to-p 通常简写为 p2p 所谓网络中的点对点。不经过中继设备直接交换数据或服务的一种技术。 p2p 由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间 环节,也使得网络上的沟通变得更容易、更直接。  有别于传统的客户 / 服务器模型。客户 / 服务器模型一般都有预定义的客户机和服务器。而在 p2p 模型转并没有明确的客户端 和服务器,p2p 作为一种网络的模型。但其实在 p2p 模型中,每一台计算机既可以看成是服务器,也可以看成是客户机。网络中,激进上的客户机 / 服务器通讯模型中,发送服务请求或者 发送数据的计算机,一般称为客户机;而接收、处置服务或接收数据的计算机称为服务器。而在 p2p 网络模型中,计算机不只接收数据,还有发送数据,不只提出 服务请求,还有接收对方的服务请求。  就有如下特点,下面介绍的用 visual c #实现的局域网点对点通讯程序。网络利用此通讯程序进行通讯的任一计算机,通讯之前,都需要侦听端 口号,接受其他机器的连接申请,并在连接建立后,就可以接收对方发送来的数据;同时也可以向其他机器提出连接申请,并在对方计算机允许建立连接请求后,发 送数据到对方。可见在网络中利用此软件进行 p2p 网络通讯的任一计算机既是客户机,同样也是服务器。  一.程序的设计、调试、运行的软件环境:  1 . 微软公司视窗 2000 服务器版  .net framework sdk 版本号 3705  2 .visual studio .net 正式版。;二.关键步骤及其解决方法:   关键方法就是实现信息在网络中的发送和接收。数据接收使用的 socket 数据发送使用的 networkstream  1. 利用 socket 来接收信息:  顺序在处置数据发送和接收时采用了不通的端口号,为了更清楚的说明问题。发送数据顺序在缺省状态设定的端口号为 "8889" 下面代码是侦听端口号 "8889" 接受网络中对此端口号的连接请求,并在建立连接后,通过 socket 接收远程计算机发送来的数据:  try { tcplistener tllisten1 = new tcplistener   8889   ; // 侦听端口号  tllisten1.start     ; socket sksocket = tllisten1.acceptsocket    ; 并获得用以接收数据的 socket 实例  // 接受远程计算机的连接请求。;endpoint tempremoteep = sksocket.remoteendpoint; // 获得远程计算机对应的网络远程终结点  while  true  { byte [] bystream = new byte[80]; // 定义从远程计算机接收到数据存放的数据缓冲区  ref tempremoteep ; int i = sksocket.receivefrom bystream.;并存放到定义的缓冲区中  // 接收数据。;string smessage = system.text.encoding.utf8.getstr bystream ; 从缓冲区中解析出内容  // 以指定的编码。;messagebox.show   smessage  ; // 显示传送来的数据  } } catch   system.security.securityexception   { " 错误 ",messagebox.show   " 防火墙安全错误! ".  messageboxicon.exclam ; messageboxbuttons.ok .;2.利用networkstream来传送信息: 在使用streamwriter处理networkstream传送数据时,数据传送的编码类型是"utf8",下列代码是对ip地址 为"10.138.198.213"的计算机的"8888"端口号提出连接申请,并在连接申请建立后,以utf8编码发送字符串"您好,见到您很高兴"到 对方,由于下列代码中的注释比较详细,这里就不具体介绍了,下列代码也是使用networkstream传送数据的典型代码: try { tcpclient tcpc = new tcpclient ("10.138.198.213",8888); //对ip地址为"10.138.198.213"的计算机的8888端口提出连接申请 networkstream tcpstream = tcpc.getstream ( ); //如果连接申请建立,则获得用以传送数据的数据流 } catch ( exception ) { messagebox.show ( "目标计算机拒绝连接请求!" ) ; break ; } try { string smsg = "您好,见到您很高兴" ; streamwriter reqstreamw = new streamwriter (tcpstream); //以特定的编码往向数据流中写入数据 ,默认为utf8编码 reqstreamw.write (smsg); //将字符串写入数据流中 reqstreamw.flush ( ); //清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流 } catch(exception) { messagebox.show ("无法发送信息到目标计算机!") ; } 当然在具体用visual c#实现网络点对点通讯程序时,还必须掌握很多其他方面的知识,如资源的回收。在用visual c#编写网络应用程序的 时候,很多朋友遇到这样的情况。当程序退出后,通过windows的"资源管理器"看到的是进程数目并没有减少。这是因为程序中使用的线程可能并没有有效 退出。虽然thread类中提供了"abort"方法用以中止进程,但并不能够保证成功退出。因为进程中使用的某些资源并没有回收。在某些情况下垃圾回收 器也不能保证完全的回收资源,还是需要我们自己手动回收资源的。在本文介绍的程序中也涉及到资源手动回收的问题。实现方法可参阅下面具体实现步骤中的第十 二步。 三.具体步骤: 在了解、掌握了上面的关键问题及其解决方法后,再实现用visual c#实现网络点对点通讯程序相对就容易许多,下面是具体的实现步骤: 1.启动visual studio .net,并新建一个visual c#项目,名称为【visual c#实现网络点对点通讯程序】。 2.在visual studio .net集成开发环境中的【解决方案资源管理器】窗口中,双击form1.cs文件,进入form1.cs文件的编辑界面。 3.在form1.cs文件的开头,用下列导入命名空间代码替代系统缺省的导入命名空间代码。 using system ; using system.drawing ; using system.collections ; using system.componentmodel ; using system.windows.forms ; using system.data ; using system.net.sockets ; using system.net ; using system.io ; using system.text ; using system.threading ; 4.再把visual studio.net的当前窗口切换到【form1.cs(设计)】窗口,并从【工具箱】中的【windows窗体组件】选项卡中往窗体中拖入下列组件: 四个button组件;二个listbox组件;四个textbox组件;一个statusbar组件;五个label组件。并在四个button组件拖 入窗体后,分别在窗体设计界面中双击它们,则系统会在form1.cs文件中分别产生这四个组件的click事件对应的处理代码。5.在【解决方案资源管理器】窗口中,双击form1.cs文件,进入form1.cs文件的编辑界面。以下面代码替代系统产生的initializecomponent过程。下面代码是对上面添加的组件进行初始化: private void initializecomponent ( ) { this.listbox1 = new system.windows.forms.listbox ( ) ; this.textbox1 = new system.windows.forms.textbox ( ) ; this.label3 = new system.windows.forms.label ( ) ; this.label2 = new system.windows.forms.label ( ) ; this.textbox3 = new system.windows.forms.textbox ( ) ; this.button1 = new system.windows.forms.button ( ) ; this.textbox2 = new system.windows.forms.textbox ( ) ; this.label1 = new system.windows.forms.label ( ) ; this.label4 = new system.windows.forms.label ( ) ; this.label5 = new system.windows.forms.label ( ) ; this.button2 = new system.windows.forms.button ( ) ; this.button3 = new system.windows.forms.button ( ) ; this.button4 = new system.windows.forms.button ( ) ; this.textbox4 = new system.windows.forms.textbox ( ) ; this.statusbar1 = new system.windows.forms.statusbar ( ) ; this.statusbarpanel1 = new system.windows.forms.statusbarpanel( ); this.statusbarpanel2 = new system.windows.forms.statusbarpanel( ); this.label6 = new system.windows.forms.label ( ) ; this.listbox2 = new system.windows.forms.listbox ( ) ; ( ( system.componentmodel.isupportinitialize ) ( this.statusbarpanel1 ) ).begininit ( ) ; ( ( system.componentmodel.isupportinitialize ) ( this.statusbarpanel2 ) ).begininit ( ) ; this.suspendlayout ( ) ; this.listbox1.itemheight = 12 ; this.listbox1.location = new system.drawing.point ( 122 , 110 ) ; this.listbox1.name = "listbox1" ; this.listbox1.size = new system.drawing.size ( 212 , 88 ) ; this.listbox1.tabindex = 4 ; this.textbox1.location = new system.drawing.point ( 122 , 18 ) ; this.textbox1.name = "textbox1" ; this.textbox1.size = new system.drawing.size ( 210 , 21 ) ; this.textbox1.tabindex = 1 ; this.textbox1.text = "" ; this.label3.location = new system.drawing.point ( 220 , 52 ) ; this.label3.name = "label3" ; this.label3.size = new system.drawing.size ( 66 , 23 ) ; this.label3.tabindex = 7 ; this.label3.text = "本地端口:" ; this.label2.location = new system.drawing.point ( 38 , 54 ) ; this.label2.name = "label2" ; this.label2.size = new system.drawing.size ( 80 , 23 ) ; this.label2.tabindex = 20 ; this.label2.text = "远程端口号:" ; this.textbox3.location = new system.drawing.point ( 294 , 50 ); this.textbox3.name = "textbox3" ; this.textbox3.size = new system.drawing.size ( 38 , 21 ) ; this.textbox3.tabindex = 3 ; this.textbox3.text = "8889" ; this.button1.flatstyle = system.windows.forms.flatstyle.flat ; this.button1.location = new system.drawing.point ( 348 , 16 ); this.button1.name = "button1" ; this.button1.size = new system.drawing.size ( 92 , 40 ); this.button1.tabindex = 6 ; this.button1.text = "连接远程机" ; this.button1.click += new system.eventhandler(this.button1_click); this.textbox2.location = new system.drawing.point ( 122 , 50 ) ; this.textbox2.name = "textbox2" ; this.textbox2.size = new system.drawing.size ( 38 , 21 ) ; this.textbox2.tabindex = 2 ; this.textbox2.text = "8888" ; this.label1.location = new system.drawing.point (38,22); this.label1.name = "label1" ; this.label1.size = new system.drawing.size ( 80 , 23 ) ; this.label1.tabindex = 16 ; this.label1.text = "远程ip地址:" ; this.label4.location = new system.drawing.point ( 50 , 84 ) ; this.label4.name = "label4" ; this.label4.size = new system.drawing.size ( 66 , 23 ) ; this.label4.tabindex = 23 ; this.label4.text = "发送信息:" ; this.label5.location = new system.drawing.point ( 36 , 112 ) ; this.label5.name = "label5" ; this.label5.size = new system.drawing.size ( 80 , 23 ) ; this.label5.tabindex = 24 ; this.label5.text = "发送的信息:" ; this.button2.enabled = false ; this.button2.flatstyle = system.windows.forms.flatstyle.flat ; this.button2.location = new system.drawing.point ( 352 , 192 ) ; this.button2.name = "button2" ; this.button2.size = new system.drawing.size ( 92 , 40 ) ; this.button2.tabindex = 7 ; this.button2.text = "断开连接" ; this.button2.click += new system.eventhandler(this.button2_click); this.button3.flatstyle = system.windows.forms.flatstyle.flat ; this.button3.location = new system.drawing.point ( 348 , 74 ); this.button3.name = "button3" ; this.button3.size = new system.drawing.size ( 92 , 40 ) ; this.button3.tabindex = 8 ; this.button3.text = "侦听端口" ; this.button3.click += new system.eventhandler(this.button3_click); this.button4.enabled = false ; this.button4.flatstyle = system.windows.forms.flatstyle.flat ; this.button4.location = new system.drawing.point ( 350 , 132 ) ; this.button4.name = "button4" ; this.button4.size = new system.drawing.size ( 92 , 40 ); this.button4.tabindex = 9 ; this.button4.text = "发送信息" ; this.button4.click += new system.eventhandler(this.button4_click); this.textbox4.location = new system.drawing.point ( 122 , 82 ) ; this.textbox4.name = "textbox4" ; this.textbox4.size = new system.drawing.size ( 212 , 21 ) ; this.textbox4.tabindex = 25 ; this.textbox4.text = "" ; this.statusbar1.location = new system.drawing.point ( 0 , 301 ) ; this.statusbar1.name = "statusbar1" ; this.statusbar1.panels.addrange ( new system.windows.forms. statusbarpanel[] { this.statusbarpanel1 ,this.statusbarpanel2} ) ; this.statusbar1.showpanels = true ; this.statusbar1.size = new system.drawing.size ( 456 , 22 ) ; this.statusbar1.tabindex = 26 ; this.statusbarpanel1.width = 200 ; this.statusbarpanel2.width = 230 ; this.label6.location = new system.drawing.point ( 48 , 210 ) ; this.label6.name = "label6" ; this.label6.size = new system.drawing.size ( 66 , 23 ) ; this.label6.tabindex = 28 ; this.label6.text = "接收信息:" ; this.listbox2.itemheight = 12 ; this.listbox2.location = new system.drawing.point (122,206); this.listbox2.name = "listbox2" ; this.listbox2.size = new system.drawing.size ( 214 , 88 ) ; this.listbox2.tabindex = 27 ; this.autoscalebasesize = new system.drawing.size ( 6 , 14 ) ; this.clientsize = new system.drawing.size ( 456 , 323 ) ; this.controls.addrange ( new system.windows.forms.control[] { this.label6 , this.listbox2 , this.statusbar1 , this.textbox4 , this.button4 , this.button3 , this.button2 , this.label5 , this.label4 , this.label2 , this.textbox3 , this.button1 , this.textbox2 , this.label1 , this.label3 , this.textbox1 , this.listbox1} ) ; this.formborderstyle = system.windows.forms.formborderstyle. fixedsingle ; this.maximizebox = false ; this.name = "form1" ; this.text = "visual c#实现网络点对点通讯程序" ; this.load += new system.eventhandler ( this.form1_load ) ; ( ( system.componentmodel.isupportinitialize ) ( this.statusbarpanel1 ) ).endinit ( ) ; ( ( system.componentmodel.isupportinitialize ) ( this.statusbarpanel2 ) ).endinit ( ) ; this.resumelayout ( false ) ; }

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《c#实现p2p点对点信息简单教程》
文章链接:https://www.skykkk.com/archives1950.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

相关推荐

  • 暂无文章