本站业务范围:1、PC端软件开发、网站开发 2、移动端APP、网站、微信接口、微商城开发 3、视频教程、课程设计和辅导 4、单片机开发 5、串口通讯调试
 当前位置:文章中心 >> Winform/客户端程序
立即购买视频教程 c#实现p2p点对点的信息传输
夜鹰教程网 来源:www.yyjcw.com 日期:2016-11-30 16:22:49
点对点即peer-to-peer,通常简写为p2p。所谓网络中的点对点,其实可以看成是一种对等的网络模型。p2p其实是实现网络上不同计算机之间, 不经过中继设备直接交换数据或服务的一种技术。p2p由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间 环节,也使得网络上的沟通变得更容易、更直接。

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

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

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

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



c#实现p2p点对点的信息传输(转)
点对点即peer-to-peer,通常简写为p2p。所谓网络中的点对点,其实可以看成是一种对等的网络模型。p2p其实是实现网络上不同计算机之间, 不经过中继设备直接交换数据或服务的一种技术。p2p由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间 环节,也使得网络上的沟通变得更容易、更直接。

p2p作为一种网络的模型,它有别于传统的客户/服务器模型。客户/服务器模型一般都有预定义的客户机和服务器。而在p2p模型转并没有明确的客户端 和服务器,但其实在p2p模型中,每一台计算机既可以看成是服务器,也可以看成是客户机。在网络中,传统上的客户机/服务器通讯模型中,发送服务请求或者 发送数据的计算机,一般称为客户机;而接收、处理服务或接收数据的计算机称为服务器。而在p2p网络模型中,计算机不仅接收数据,还有发送数据,不仅提出 服务请求,还有接收对方的服务请求。

在下面介绍的用visual c#实现的局域网点对点通讯程序,就有如下特点,在网络利用此通讯程序进行通讯的任一计算机,在通讯之前,都需要侦听端 口号,接受其他机器的连接申请,并在连接建立后,就可以接收对方发送来的数据;同时也可以向其他机器提出连接申请,并在对方计算机允许建立连接请求后,发 送数据到对方。可见在网络中利用此软件进行p2p网络通讯的任一计算机既是客户机,同样也是服务器。

一.程序的设计、调试、运行的软件环境:

(1).微软公司视窗2000服务器版

(2).visual studio .net正式版,.net framework sdk版本号3705

二.关键步骤及其解决方法: 关键步骤就是实现信息在网络中的发送和接收。数据接收使用的是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];
//定义从远程计算机接收到数据存放的数据缓冲区
int i = sksocket.receivefrom(bystream,ref tempremoteep);
//接收数据,并存放到定义的缓冲区中
string smessage = system.text.encoding.utf8.getstring(bystream);
//以指定的编码,从缓冲区中解析出内容
messagebox.show ( smessage );
//显示传送来的数据
}
}
catch ( system.security.securityexception )
{
messagebox.show ( "防火墙安全错误!","错误",
messageboxbuttons.ok , messageboxicon.exclamation);
}

 

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

 

至此,【visual c#实现网络点对点通讯程序】项目的界面设计和功能实现的前期工作就完成了,设计界面如图1所示:


图1 项目的设计界面


6.在【解决方案资源管理器】窗口中,双击form1.cs文件,进入form1.cs文件的编辑界面。并在定义form类成员代码区中,加入下列代码,下列代码的作用是定义程序中使用的全局变量。

private thread th ;
//创建线程,用以侦听端口号,接收信息
private tcplistener tllisten1 ;
//用以侦听端口号
private bool listenerrun = true ;
//设定标示位,判断侦听状态
private networkstream tcpstream ;
//创建传送/接收的基本数据流实例
private streamwriter reqstreamw ;
//用以实现向远程主机传送信息
private tcpclient tcpc ;
//用以创建对远程主机的连接
private socket sksocket ;
//用以接收远程主机传送来的数据

 

7.用下列代码替换form1.cs中的button1组件的"click"事件对应的代码,下列代码的作用是向远程计算机提出连接申请,如果连接建立,则获得传送数据的数据源:

private void button1_click (object sender, system.eventargs e)
{
try
{
tcpc = new tcpclient ( textbox1.text ,
int32.parse ( textbox3.text ) ) ;
//向远程计算机提出连接申请
tcpstream = tcpc.getstream ( ) ;
//如果连接申请建立,则获得用以传送数据的数据流
statusbar1.panels[0].text="成功连接远程计算机!" ;
button2.enabled = true ;
button1.enabled = false ;
button4.enabled = true ;
}
catch ( exception )
{
statusbar1.panels[0].text = "目标计算机拒绝连接请求!" ;
}
}

 

8.在form1.cs中的main函数之后,添加下列代码,下面代码是定义一个名称为"listen"的过程:

private void listen ( )
{
try
{
tllisten1 = new tcplistener ( int32.parse(textbox2.text));
tllisten1.start ( ) ;
//侦听指定端口号
statusbar1.panels[1].text = "正在监听..." ;
//接受远程计算机的连接请求,并获得用以接收数据的socket实例
sksocket = tllisten1.acceptsocket ( ) ;
//获得远程计算机对应的网络远程终结点
endpoint tempremoteep = sksocket.remoteendpoint ;
ipendpoint tempremoteip = ( ipendpoint )tempremoteep ;
iphostentry host = dns.gethostbyaddress
( tempremoteip.address ) ;
string hostname = host.hostname ;
//根据获得的远程计算机对应的网络远程终结点获得远程计算机的名称
statusbar1.panels[1].text = "" + hostname +" " +
"远程计算机正确连接!" ;
//循环侦听
while ( listenerrun )
{
byte[] stream = new byte[80] ;
//定义从远程计算机接收到数据存放的数据缓冲区
string time = datetime.now.tostring ( ) ;
//获得当前的时间
int i = sksocket.receivefrom ( stream,
ref tempremoteep ) ;
//接收数据,并存放到定义的缓冲区中
string smessage = system.text.encoding.utf8.
getstring ( stream ) ;
//以指定的编码,从缓冲区中解析出内容
listbox2.items.add(time+""+hostname+":");
listbox2.items.add ( smessage ) ;
//显示接收到的数据
}
}
catch ( system.security.securityexception )
{
messagebox.show ( "防火墙安全错误!" ,"错误" ,
messageboxbuttons.ok , messageboxicon.exclamation) ;
}
}

 

9.用下列代码替换form1.cs中的button2组件的click事件对应的处理代码,下列代码的作用是断开当前的连接:

private void button2_click ( object sender, system.eventargs e)
{
listenerrun = false ;
tcpc.close ( ) ;
statusbar1.panels[0].text = "断开连接!" ;
button1.enabled = true ;
button2.enabled = false ;
button4.enabled = false ;
}

 

10.用下列代码替换form1.cs中的button3组件的click事件对应的处理代码,下列代码的作用是以上面定义的listen过程来初始化线程实例,并启动线程,达到侦听端口的目的:

private void button3_click (object sender , system.eventargs e)
{
th = new thread ( new threadstart ( listen ) ) ;
//以listen过程来初始化线程实例
th.start ( ) ;
//启动此线程
}

 

11.用下列代码替换form1.cs中的button4组件的click事件对应的处理代码,下列代码的作用是向远程计算机的指定端口号发送信息。

private void button4_click ( object sender,system.eventargs e)
{
try
{
string smsg = textbox4.text ;
string myname = dns.gethostname ( ) ;
//以特定的编码往向数据流中写入数据,
//默认为utf8encoding 的实例
reqstreamw = new streamwriter ( tcpstream ) ;
//将字符串写入数据流中
reqstreamw.write ( smsg ) ;
//清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流
reqstreamw.flush ( ) ;
string time = datetime.now.tostring ( ) ;
//显示传送的数据和时间
listbox1.items.add ( time +" " + myname +":" ) ;
listbox1.items.add (smsg ) ;
textbox4.clear ( ) ;
}
//异常处理
catch ( exception )
{
statusbar1.panels[0].text = "无法发送信息到目标计算机!";
}
}

 

12.用下列代码替换form1.cs中的"dispose"过程对应的处理代码,下列代码的作用是在程序退出后,清除没有回收的资源:

protected override void dispose ( bool disposing )
{
try
{
listenerrun = false ;
th.abort ( ) ;
th = null ;
tllisten1.stop ( ) ;
sksocket.close ( ) ;
tcpc.close ( ) ;
}
catch { }
if ( disposing )
{
if ( components != null )
{
components.dispose ( ) ;
}
}
base.dispose ( disposing ) ;
}

 

13.运行程序,实现网络点对点通讯:

单击快捷键f5编译成功后,把此程序分发到网络中的二台计算机中。在正确输入侦听端口号、远程计算机ip地址、远程端口号输入正确后,单击【侦听端口】和【连接远程机】按钮建立聊天的连接。就通过【发送信息】按钮进行聊天了。图2是通讯时运行界面。

 图2 运行界面

 五.总结:

网络点对点通讯程序并不像客户端/服务器端模型程序那样,分成客户端程序和服务器端程序。它是集客户端程序和服务器端程序与一身,所以在具体的程序设 计中就相对麻烦一点。上面介绍的在用visual c#实现网络点对点通讯的示例虽然结构并不复杂,但涉及的知识面却比较广泛。如示例中涉及到许多很多网 络功能的实现,如:侦听端口号、建立连接、发送数据和接收数据等,还涉及到线程的处理、资源的回收等。了解、掌握这些问题的处理方法对编写更复杂的网络应 用程序是十分必要的

复制链接 网友评论 收藏本文 关闭此页
上一条: 点对点技术:一个实际的P2P应用程…  下一条: windows下定期自动备份本地文件(文件夹…
夜鹰教程网成立于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