多线程在Visual C#网络编程中的应用

网络应用程序的一般都会或多或少的使用到线程,甚至可以说,一个功能稍微强大的网络应用程序总会在其中开出或多或少的线程,如果应用程序中开出的线程数目大于二个,那么就可以把这个程序称之为多线程应用程序。那么为什么在网络应用程序总会和线程交缠在一起呢?这是因为网络应用程序在执行的时候,会遇到很多意想不到的问题,其中最常见的是网络阻塞和网络等待等。

  程序在处理这些问题的时候往往需要花费很多的时间,如果不使用线程则程序在执行时的就会表现出如运行速度慢,执行时间长,容易出现错误、反应迟钝等问题。而如果把这些可能造成大量占用程序执行时间的过程放在线程中处理,就往往能够大大提高应用程序的运行效率和性能和获得更优良的可伸缩性。那么这是否就意味着应该在网络应用程序中广泛的使用线程呢?情况并非如此,线程其实是一把双刃剑,如果不分场合,在不需要使用的地方强行使用就可能会产生许多程序垃圾,或者在程序结束后,由于没有能够销毁创建的进程而导致应用程序挂起等问题。

  所以如果你认为自己编写的代码足够快,那我给你的建议还是别使用线程或多线程。这里要提醒诸位的是如果您对在Windows下的线程和其执行原理和机制还不十分清楚,可以先参阅一下介绍Windows操作系统方面的书籍,它们一般都会对其进行比较详细的阐述。然后再阅读本文。

  一.简介在Visual C#中创建和使用线程:

  Visual C#中使用的线程都是通过自命名空间System.Threading中的Thread类经常实例化完成的。通过Thread类的构造函数来创建可供Visual C#使用的线程,通过Thread中的方法和属性来设定线程属性和控制线程的状态。以下Thread类中的最典型的构造函数语法,在Visual C#中一般使用这个构造函数来创建、初始化Thread实例。

public Thread (
 ThreadStart start
) ;

  参数

  start ThreadStart 委托,它将引用此线程开始执行时要调用的方法。

  Thread还提供了其他的构造函数来创建线程,这里就不一一介绍了。表01是Thread类中的一些常用的方法及其简要说明:


方法说明
Abort调用此方法通常会终止线程,但会引起ThreadAbortException类型异常。
Interrupt中断处于WaitSleepJoin 线程状态的线程。
Join阻塞调用线程,直到某个线程终止时为止。
ResetAbort 取消当前线程调用的Abor方法。
Resume继续已挂起的线程。
Sleep 当前线程阻塞指定的毫秒数。
Start操作系统将当前实例的状态更改为ThreadState.Running。
Suspend挂起线程,或者如果线程已挂起,则不起作用。
              表01:Thread类的常用方法及其说明

  这里要注意的是在 .Net中执行一个线程,当线程执行完毕后,一般会自动销毁。如果线程没有自动销毁可通过Thread中的Abort方法来手动销毁,但同样要注意的是如果线程中使用的资源没有完全销毁,Abort方法执行后,也不能保证线程被销毁。在Thread类中还提供了一些属性用以设定和获取创建的Thread实例属性,表02中是Thread类的一些常用属性及其说明:

属性说明
CurrentCulture获取或设置当前线程的区域性。
CurrentThread获取当前正在运行的线程。
IsAlive获取一个值,该值指示当前线程的执行状态。
IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。
Name获取或设置线程的名称。
Priority 获取或设置一个值,该值指示线程的调度优先级。
ThreadState获取一个值,该值包含当前线程的状态。
             表02:Thread类的常用属性及其说明
  二.本文的主要内容及程序调试和运行环境:

  本文的主要内容是介绍多线程给用Visual C#编写网络应用程序带来的更高性能提高。具体的做法是在Visual C#用二种不同的方法,一种采用了多线程,另一种不是,来实现同一个具体网络应用示例,此示例的功能是获取网络同一网段多个IP地址对应的 计算机的在线状态和对应的 计算机名称,通过比较这二种方法的不同执行效率就可知多线程对提高网络应用程序的执行效率是多么的重要了。以下是本文中设计到程序的调试和运行的基本环境配置:

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

  (2).Visual Studio .Net 2002正式版, .Net FrameWork SDK版本号3705。

   三.扫描网络计算机的原理

  下面介绍的这个示例的功能是通过扫描一个给定区间IP地址,来判断这些IP地址对应的 计算机是否在线,如果在线则获得IP地址对应的 计算机名称。程序判断 计算机是否在线的是采用对给定IP地址的 计算机进行DNS解析,如果能够根据IP地址解析出对应的 计算机名称,则说明此IP地址对应的 计算机在线;反之,如果解析不出,则会产生异常出错,通过对异常的捕获,得到此IP地址对应的 计算机并不在线。

  为了更清楚地说明问题和便于掌握在Visual C#编写多线程网络应用程序的方法,本文首先介绍的是不基于多线程的网络 计算机扫描程序的编写步骤,然后再在其基础上,把它修改成多线程的 计算机扫描程序,最后比较这二个程序的执行效率,你就会发现线程在网络编程中的重要作用了。
  四.Visual C#实现不基于多线程的网络计算机扫描程序

  以下是在Visual C#实现不基于多线程的网络 计算机扫描程序步骤:

  1. 启动Visual Studio .Net,并新建一个Visual C#项目,项目名称为【扫描网络 计算机】。

  2. 把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应操作:

  四个NumericUpDown组件,用以组合成一个IP地址区间。

  一个ListBox组件,用以显示扫描后的结果。

  一个ProgressBar组件,用以显示程序的运行进度。

  四个Label组件,用以显示提示信息。

  一个GroupBox组件。

  一个Button组件,名称为button1,并在这组件拖入窗体后,双击button1,这样Visual Studio .Net就会产生这button1组件Click事件对应的处理代码。

  界面设置如下图:

200662221746589.jpg
图01:【扫描网络 计算机】项目的设计界面

  3. 把Visual Studio .Net的当前窗口切换到【Form1.cs】,进入Form1.cs文件的编辑界面。在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 ;

  4. 用下列代码替换Form1.cs中的button1的Click时间对应的处理代码,下列代码的功能是扫描给定的IP地址区间,并把扫描结果显示出来。

private void button1_Click ( object sender , System.EventArgs e )
{
 listBox1.Items.Clear ( ) ;
 //清楚扫描结果显示区域
 DateTime StartTime = DateTime.Now ;
 //获取当前时间
 string mask = numericUpDown1.Value.ToString ( ) + "." + numericUpDown2.Value.ToString ( ) +
"." + numericUpDown3.Value.ToString ( ) + "." ;
 int Min = ( int ) numericUpDown4.Value ;
 int Max = ( int ) numericUpDown5.Value ;
 if ( Min > Max )
 {
  MessageBox.Show ( "输入的IP地址区间不合法,请检查!" , "错误!" ) ;
  return ;
 }
 //判断输入的IP地址区间是否合法
 progressBar1.Minimum = Min ;
 progressBar1.Maximum = Max ;
 int i ;
 for ( i = Min ; i <= Max ; i++ )
 {
  string ip= mask + i.ToString ( ) ;
  IPAddress myIP = IPAddress.Parse ( ip ) ;
  //根据给定的IP地址字符串,处境IPAddress实例
  try
  {
   IPHostEntry myHost = Dns.GetHostByAddress ( myIP ) ;
   string HostName = myHost.HostName.ToString ( ) ;
   listBox1.Items.Add ( ip + "名称为:" + HostName ) ;
  }
  catch
  {
   listBox1.Items.Add ( ip + "主机没有响应!" ) ;
  }
  progressBar1.Value = i ;
 }
 //扫描给定IP地址对应的计算机是否在线
 DateTime EndTime = DateTime.Now ;
 TimeSpan ts = EndTime-StartTime ;
 //获得扫描网络计算机所使用的时间
 label4.Text = ts.Seconds.ToString ( ) + "秒" ;
 MessageBox.Show ( "成功完成检测!" , "提示" ) ;
 progressBar1.Value = Min ;
}

  由于上述代码比较简单,并且在代码中的注释也比较详细,这里就不加以解释了,但请注意上面代码中对时间日期类型数据的处理方法。因为有很多人曾经向我讯问过类似问题。

  5. 至此,不基于多线程的【扫描网络 计算机】项目的全部工作就完成了,程序的执行是很机械的,其方法是对每一个IP按照顺序进行DNS解析,并得到解析结果,所以程序的执行时间和扫描的IP地址区间段大小成正比。图02是此程序运行后,扫描"10.138.198.1"至"10.138.198.10"这个IP地址区间 计算机后的运行界面。整个程序的运行时间为43秒:

200662221747490.jpg
图02:不基于多线程的【扫描网络 计算机】项目的运行界面
  五.把【扫描网络计算机】程序修改成基于多线程的程序

  在修改成多线程程序之前,必须面对并解决下面几个问题:

  1. 线程是无返回值的,所以在线程中处理、调用的应是一个过程,所以要把扫描IP地址对应的 计算机的代码给包装成一个过程。

  2. 放在线程中处理的过程,因为没有返回值,从而无法向主程序(进程)传递数值。但扫描IP地址对应的 计算机的过程却要向主程序(进程)传递IP地址是否在线的数据,所以在修改成多线程程序之前,必须从线程往主程序(进程)传递数据的问题。

  下面是在【扫描网络 计算机】项目的基础上,把它修改成基于多线程程序的具体实现步骤:

  1. 由于程序中使用到线程,所以在Form1.cs代码首部,导入命名空间代码区中加入下列代码,下列代码是导入Thread类所在的命名空间。

using System.Threading ;

  2. 在Form1.cs代码的namespace代码区加入下列语句,下列语句是定义一个delegate:

public delegate void UpdateList ( string sIP , string sHostName ) ;

  3. 在Form1.cs中的定义Form1的class代码区定义加入下列代码,下列代码是定义一个变量,用以存放程序执行的时间:

private System.DateTime StartTime ;

  4. 在Form1.cs代码的Main函数之后,添加下列代码,下列代码是创建一个名称为ping的Class,这个Class能够通过其设定的属性接收给定的IP地址字符串,并据此来判断此IP地址字符串对应的 计算机是否在线,并通过其设定的HostName属性接收从线程传递来的数据。

public class ping
{
 public UpdateList ul ;
 public string ip ;
 //定义一个变量,用以接收传送来的IP地址字符串
 public string HostName ;
 //定义一个变量,用以向主进展传递对应IP地址是否在线数据
 public void scan ( )
 {
  IPAddress myIP = IPAddress.Parse ( ip ) ;
  try
  {
   IPHostEntry myHost = Dns.GetHostByAddress ( myIP );
   HostName = myHost.HostName.ToString ( ) ;
  }
  catch
  {
   HostName = "" ;
  }
  if (HostName == "")
   HostName = " 主机没有响应!";
  if ( ul != null)
   ul ( ip , HostName ) ;
 }
 //定义一个过程(也可以看出为方法),用以判断传送来的IP地址对应计算机是否在线
}

  5. 在Form1.cs中添加完上述代码后,再添加下列代码:

void UpdateMyList ( string sIP , string sHostName )
{
 lock ( listBox1 )
 {
  listBox1.Items.Add ( sIP + " " + sHostName ) ;
  if ( progressBar1.Value != progressBar1.Maximum )
  {
   progressBar1.Value++ ;
  }
  if ( progressBar1.Value == progressBar1.Maximum )
  {
   MessageBox.Show ( "成功完成检测!" , "提示" ) ;
   DateTime EndTime = DateTime.Now ;
   TimeSpan ts = EndTime-StartTime ;
   label4.Text = ts.Seconds.ToString ( ) + "秒" ;
   //显示扫描计算机所需要的时间
   progressBar1.Value = progressBar1.Minimum ;
  }
 }
}

  6. 用下列代码替换Form1.cs中button1的Click事件对应的处理代码,下列代码功能是创建多个扫描给定IP地址区间对应的 计算机线程实例,并显示扫描结果。

private void button1_Click(object sender, System.EventArgs e)
{
 listBox1.Items.Clear ( ) ;
 //清楚扫描结果显示区域
 StartTime = DateTime.Now ;
 //获取当前时间
 string mask = numericUpDown1.Value.ToString ( ) + "." + numericUpDown2.Value.ToString ( ) +
"." + numericUpDown3.Value.ToString ( ) + "." ;
 int Min = ( int ) numericUpDown4.Value ;
 int Max = ( int ) numericUpDown5.Value ;
 if ( Min > Max )
 {
  MessageBox.Show ( "输入的IP地址区间不合法,请检查!" , "错误!" ) ;
  return ;
 }
 //判断输入的IP地址区间是否合法
 int _ThreadNum = Max - Min + 1 ;
 Thread[] mythread = new Thread [ _ThreadNum ] ;
 //创建一个多个Thread实例
 progressBar1.Minimum = Min ;
 progressBar1.Maximum = Max + 1 ;
 progressBar1.Value = Min ;
 int i ;
 for (i = Min ; i <= Max ; i++ )
 {
  int k = Max - i ;
  ping HostPing = new ping ( ) ;
  //创建一个ping实例
  HostPing.ip = mask + i.ToString ( ) ;
  HostPing.ul = new UpdateList ( UpdateMyList ) ;
  //向这个ping实例中传递IP地址字符串
  mythread[k] = new Thread ( new ThreadStart ( HostPing.scan ) ) ;
  //初始化一个线程实例
  mythread[k].Start ( ) ;
  //启动线程
 }
}

  至此,【扫描网络 计算机】项目已经被修改成一个多线程的程序了,此时在运行程序,并且同样再扫描上面给定IP地址区间对应的 计算机,就会惊奇的发现程序执行时间所建为10秒了,并且不论要扫描的 计算机数目有多少,程序的运行时间也是10秒左右,这是因为程序为扫描每一个IP都分配一个线程,这样程序的执行时间就不与要扫描的IP地址段中的IP地址数目有关联了,这样也就大大减少了程序的运行时间,提高了程序的运行效率,这也充分体现出多线程给网络编程带来的好处。图03也是程序扫描"10.138.198.1"至"10.138.198.10"这个IP地址区间 计算机后的运行界面所示:

200662221748524.jpg
图03:基于多线程的【扫描网络 计算机】项目的运行界面

  通过对二个程序的比较可见,在编写网络应用程序中,正确的使用线程的确能够大大提高程序的运行效率。

   六.总结

  至此,本节要介绍的内容就全部结束了,不知道诸位通过上面的介绍是否了解、掌握了下面几点:

  1. 如何获取系统当前时间,和实现时间日期类型数据的加减。

  2. 在编写网络应用程序时候,使用线程(多线程)的原因,以及线程(多线程)会给网络应用程序带来什么好处。

  3. 如何在应用程序中创建多个线程实例。

  4. 如何实现带"返回值"的线程。

  如果上述要点你都能够掌握,那是再好不过的了。但如果你对线程及其使用方法还感觉模糊,那也不要紧,毕竟线程在编程技术中是一个内容丰富,使用复杂的东东,要立马掌握的确是很困难的事情。在以后的文章中也将再介绍这方面的内容。

转载于:https://www.cnblogs.com/hzuIT/articles/682809.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书详细介绍了利用Visual C# 2005进行网络编程的方法和技巧。全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和工程实践性,书提供的通用模块和典型实例稍加修改就可以为读者所用。   本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学参考书。 第1章 C#.NET网络编程概述  1.1 网络通信概述   1.1.1 网络通信模型概述   1.1.2 网络通信协议、接口和服务概述   1.1.3 TCP/IP网络架构概述   1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类   1.2.1 IPAddress类   1.2.2 DNS类   1.2.3 IPHostEntry类   1.2.4 IPEndPoint类   1.2.5 Socket类  1.3 套接字概述   1.3.1 套接字的类型和常用属性   1.3.2 建立面向连接的套接字   1.3.3 建立面向无连接的套接字  1.4 使用套接字的简单示例   1.4.1 C/S与B/S架构通信模式概述   1.4.2 编写客户端代码   1.4.3 编写服务器端代码 .  1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与网络通信   2.1.1 基于线程的网络通信概述   2.1.2 在网络编程使用多线程   2.1.3 线程基础   2.1.4 多线程网络编程应用  2.2 网络通信的常见问题   2.2.1 让网络通信代码更强壮   2.2.2 数据缓冲区处理方法  2.3 TCP无保护消息边界   2.3.1 发送固定长度的消息   2.3.2 采用变长的消息   2.3.3 使用特殊标记处理消息  2.4 本章小结 第3章 开发基于TCP协议的应用程序  3.1 套接字与TCP协议   3.1.1 使用套接字传输数据   3.1.2 NetworkStream对象同数据发送与接收   3.1.3 TcpClient与TcpListener类   3.1.4 使用TCP/IP协议编写应用层的通信代码  3.2 开发异步的TCP应用编程   3.2.1 TCP的异步通信流程   3.2.2 线程阻塞与异步的同步问题  3.3 开发异步的TCP聊天程序   3.3.1 客户端界面设计   3.3.2 客户端业务逻辑设计   3.3.3 服务器端界面设计   3.3.4 服务器端业务逻辑设计   3.3.5 运行界面  3.4 本章小结 第4章 开发基于UDP的应用程序  4.1 UDP通信协议概述   4.1.1 UDP协议与TCP协议的差别   4.1.2 UDP协议的使用场合  4.2 在C#下UDP协议的相关类   4.2.1 IPAddress类   4.2.2 UdpClient类的构造函数   4.2.3 UdpClient类的常用方法与实例  4.3 UDP协议使用示例   4.3.1 UDP模块功能概述   4.3.2 设计通信流程   4.3.3 开发服务器端程序   4.3.4 开发客户端程序   4.3.5 使用多线程开发UDP协议   4.3.6 使用校验保证信息完整性   4.3.7 效果演示  4.4 本章小结 第5章 开发基于SNMP协议的应用程序  5.1 SNMP协议概述   5.1.1 了解SNMP协议   5.1.2 SNMP的常用命令   5.1.3 设计SNMP包  5.2 SNMP协议使用示例   5.2.1 需求分析与设计   5.2.2 设计程序流程   5.2.3 程序窗口界面设计   5.2.4 SNMP类编写   5.2.5 SNMP程序窗口类编写  5.3 运行效果演示  5.4 使用供货商提供的MIB库  5.5 本章小结 第6章 使用.NET发送邮件  6.1 邮件发送与接收协议概述   6.1.1 SMTP协议与邮件发送   6.1.2 POP3协议与邮件接收   6.1.3 .NET下支持SMTP和POP3的类  6.2 邮件发送与接收模块   6.2.1 需求分析与设计   6.2.2 设计邮件发送和接收的流程   6.2.3 界面设计   6.2.4 编写主窗口的业务逻辑   6.2.5 编写发送邮件的业务逻辑   6.2.6 编写接收邮件的业务逻辑   6.2.7 使用多线程发送与接收邮件  6.3 运行效果演示  6.4 本章小结 第7章 FTP下载与文件传输  7.1 FTP协议概述   7.1.1 使用FTP协议下载文件的流程   7.1.2 相关类库说明  7.2 FTP客户端设计   7.2.1 需求分析   7.2.2 界面设计   7.2.3 业务逻辑设计  7.3 FTP服务器端设计   7.3.1 需求分析   7.3.2 FTP响应码   7.3.3 业务逻辑设计  7.4 运行界面  7.5 本章小结 第8章 基于C#.NET的网络管理模块  8.1 ICMP协议概述   8.1.1 ping命令   8.1.2 tracert命令  8.2 ICMP包  8.3 编写网络管理模块   8.3.1 需求分析   8.3.2 界面设计   8.3.3 编写核心icmp类的业务逻辑   8.3.4 编写具有ping功能的业务逻辑   8.3.5 编写具有tracert功能的业务逻辑   8.3.6 编写findmask功能的业务逻辑   8.3.7 编写时间戳功能的业务逻辑  8.4 运行界面  8.5 本章小结 第9章 编写基于.NET的Web Service  9.1 Web Service概述   9.1.1 Web服务基本概念   9.1.2 Web服务的优势   9.1.3 Web服务的架构  9.2 需求分析与设计   9.2.1 需求分析   9.2.2 文件功能设计   9.2.3 数据库设计  9.3 编写Web Service服务系统   9.3.1 构建Web Service   9.3.2 编写Web服务代码   9.3.3 主页面与登录相关的WebService数据访问模块   9.3.4 发表主题相关的Web Service访问模块   9.3.5 投票相关的Web Service访问模块   9.3.6 管理相关的Web Service访问模块  9.4 主页面与登录模块   9.4.1 界面设计   9.4.2 编写业务逻辑  9.5 发表主题模块   9.5.1 界面设计   9.5.2 编写业务逻辑  9.6 投票模块   9.6.1 界面设计   9.6.2 编写业务逻辑  9.7 管理模块   9.7.1 界面设计   9.7.2 编写业务逻辑  9.8 本章小结 第10章 基于.NET的远程技术  10.1 远程技术概述   10.1.1 远程技术开发结构   10.1.2 远程技术使用  10.2 远程控制开发客户端的设计   10.2.1 界面设计与控件使用   10.2.2 客户端的代码设计  10.3 远程控制开发服务器端的设计   10.3.1 界面设计与控件使用   10.3.2 服务器端的代码设计  10.4 运行效果演示  10.5 本章小结 第11章 流媒体在线播放  11.1 需求分析与设计   11.1.1 需求分析   11.1.2 模块设计   11.1.3 数据库设计  11.2 DirectShow接口   11.2.1 滤波图模型   11.2.2 如何使用DirectShow接口   11.2.3 流媒体在线播放相关接口  11.3 流媒体协议   11.3.1 实时传输协议(RTP)   11.3.2 实时传输控制协议(RTCP)   11.3.3 实时流传输协议(RTSP)   11.3.4 流媒体服务过程  11.4 建立.NET的窗体项目   11.4.1 主窗口界面设计   11.4.2 收藏夹数据库相关业务逻辑设计   11.4.3 流媒体在线播放器业务逻辑设计  11.5 运行效果演示  11.6 本章小结 第12章 在线五子棋系统模块  12.1 需求分析与设计   12.1.1 需求分析   12.1.2 模块设计  12.2 五子棋规则类设计   12.2.1 胜负判定类   12.2.2 行棋规则类  12.3 基于TCP协议的通信类   12.4 网络配置模块   12.4.1 网络配置模块的界面设计   12.4.2 网络配置模块的代码设计  12.5 扫描主机模块   12.5.1 扫描主机模块的界面设计   12.5.2 扫描主机模块的代码设计  12.6 主界面模块   12.6.1 主界面模块的界面设计   12.6.2 主界面模块的代码设计  12.7 运行界面  12.8 本章小结 第13章 基于HTTP协议的下载工具  13.1 HTTP协议   13.1.1 HTTP下载理论   13.1.2 .NET的几个支持HTTP协议的类  13.2 异步机制   13.2.1 异步机制的原理   13.2.2 异步类  13.3 下载工具的设计   13.3.1 需求设计   13.3.2 模块设计   13.3.3 界面设计   13.3.4 业务逻辑设计  13.4 运行效果演示  13.5 本章小结 Microsoft Visual C# 2005是一种新的编程环境,它是为生成在.NET Framework上运行的多种应用程序而设计的。C#简单,功能强大,类型安全,而且是面向对象的。C#凭借它的许多创新实现了对应用程序的快速开发。. Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。 本书大量地使用了.NET Framework提供的类库的函数来协同开发,通过使用这些已经被封装的类来协助开发确实提高了不少效率,为开发工作带来了诸多的便利。 本书共分13章,第1章介绍了利用Visual C# 2005提供的网络命名空间下的诸多API进行套接字的开发,并对网络编程的原理进行了详细的阐述,为后续的章节奠定了基础。 第2章介绍了具有多线程能力的网络应用程序,这使得用户开发的程序能够适应更加复杂的情况。 第3章~第8章是本书的重要部分,主要介绍基于各种不同协议的网络编程应用模块。第3章介绍了基于TCP协议的聊天程序;第4章介绍了基于UDP的通信程序;第5章介绍了使用SNMP协议的网络管理程序;第6章介绍了使用SMTP以及POP3协议的E-mail系统;第7章介绍了基于FTP的文件传输模块;第8章介绍了使用ICMP协议的网络探测程序。 第9章介绍了基于Web Service的电子公告板系统,并结合采用了SQL Server 2005数据库;第10章介绍了使用远程控制技术的应用程序;第11章则介绍了流媒体在线播放系统。.. 第12章介绍了基于TCP通信协议的在线五子棋系统;第13章主要介绍了基于HTTP协议的下载工具,该工具具有多线程下载、断点续传的功能。 本书注重理论指导性和工程实践性,书提供的各个网络应用程序只要稍加修改就可以为读者所用。本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学、参考用书。 本书主要由梅晓冬、颜烨青执笔,在编写本书程序的过程,得到了陈璧元的大力支持,在此表示衷心的感谢。此外,还要感谢杨文军、程伟、袁远、刘武、彭澜、李通、李杰、卢茂琼、张燕生、胡燕生、邓湘成、卢下知、王周浩、邱岳、刘流、代本、刘明星、孙靖华等人,他们在本书编写过程给予了我鼓励和支持。 由于时间仓促,加之水平有限,书不足之处在所难免,敬请读者批评指正。... 编者 2008年1月
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值