7网络应用编程-习题解答(合并版)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

网络应用编程习题解答课程名称网络应用编程院(部)计算机与信息工程学院教研室(实验室)网络工程教研室主讲教师侯彦娥职称讲师使用教材21世纪高等学校计算机规划教材(精品系列)《C#网络应用编程(第2版)》,马骏等主编,人民邮电出版社第1章习题解答1.简要回答什么是分散式、集中式和分布式通信模型。【解答】分散式指用户只负责管理自己的计算机系统,各自独立的系统之间没有资源或信息的交换或共享。集中式指用一台主计算机保存一个企业组织的全部数据,而用户则通过终端连接到这台主计算机系统并与之通信,从而达到访问数据的目的。终端是包含键盘和显示器的端设备,通过通信链路发送和接收数据。分布式是分散式系统和集中式系统的混合,它由一个又一个连接起来的独立计算机组成。企业管理系统就是集中式和分布式综合的一种表现,所有数据用专用的数据库(SQLServer、Oracle或者DB2)集中存储,属于集中式,而对数据的处理则由各个部门的软件分别控制,属于分布式。2.TCP/IP四层模型中各层的主要功能是什么?【解答】TCP/IP参考模型采用4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:应用层、传输层、网际层和网络接口层。应用层负责应用程序之间的沟通。传输层提供节点间的数据传送以及应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。网际层负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机,但它不检查数据包是否被正确接收。网络接口层负责接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体进行管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。第2章习题解答1)进程和线程有什么区别?1)一个完整的进程拥有自己独立的内存空间和数据,但是同一个进程内的线程是共享内存空间和数据的。一个进程对应着一段程序,它是由一些在同一个程序里面独立的同时运行的线程组成的。线程有时也被称为并行运行在程序里的轻量级进程,这是因为它的运行依赖于进程提供的上下文环境,并且使用的是进程的资源。在一个进程里,线程的调度有抢占式或者非抢占的模式。在抢占模式下,操作系统负责分配CPU时间给各个线程,一旦当前的线程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。2)线程是如何创建的?怎样设置线程的优先级?C#中创建线程的工作是通过使用System.Threading名称空间下的Thread类的构造方法来完成的,如创建一个线程实例输出字符“a”1000次。Threadthread=newThread(newThreadStart(func1));thread.Priority=ThreadPriority.Normal;thread.Start();staticvoidfunc1(){for(inti=0;i1000;i++){Console.WriteLine(a);}}C#中System.Threading名称空间下的ThreadPriority枚举类定义了线程可能具有的所有优先级的值,优先级由高到低排序为:Highest,AboveNormal,Normal,BelowNormal,Lowest。可以通过访问线程的Priority属性来获取和设置其优先级。每个线程都具有分配给它的线程优先级。在公共语言运行库中创建的线程最初分配的优先级为ThreadPriority.Normal。在运行库以外创建的线程保留它们在进入托管环境之前具有的优先级。可以使用Thread.Priority属性获取或设置任何线程的优先级。3)前台线程和后台线程有什么区别?如何将一个线程设置为后台线程?3)前台线程和后台线程的区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。利用Thread对象的IsBackground属性,可以设置或判断一个线程是后台线程还是前台线程。在任何时候,都可以通过将某个线程的IsBackground属性设置为true,使其变为后台线程。2.为什么要用多线程?多线程适用于哪种场合?【解答】在Client/Server模式下,服务器需要不断监听来自多个客户端的请求,这时,如果采用单线程机制的话,这个线程由于要不断的循环监听客户端请求,从而无暇处理其他的任务。要让服务器同时为多个客户服务,必须引入多线程技术。实际上,当执行需要较长时间才能完成的连续操作时,或者等待网络或其他I/O设备响应时,都可以使用多线程技术。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。3.什么是线程同步?为什么需要使用线程同步?C#提供了什么语句可以简单地实现线程的同步?【解答】多个线程同时运行时,可能会因为线程之间的逻辑关系而而决定最先执行,谁后执行。这就是线程同步。同步是多线程中一个非常重要的概念。所谓同步,是指多个线程之间存在先后执行顺序的关联关系。使用多线程可以解决了吞吐量和响应速度的问题,但同时也带来了资源共享问题,如死锁和资源争用。如果一个线程必须在另一个线程完成某个工作后才能继续执行,则必须考虑如何让其保持同步,以确保在系统上同时运行多个线程而不会出现死锁或逻辑错误。当两个线程t1和t2有相同的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在变量variable1中写入某个值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该变量的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用variable1,在该线程完成对variable1的写入工作后再让t2读取这个值,就可以避免出现此类错误。C#提供了lock语句来实现线程的同步。4.什么是线程池?使用线程池有什么好处?【解答】线程池是在后台执行多个任务的线程集合。使用线程池接受传入的请求,每个传入请求都分配给线程池中的一个线程,从而达到异步处理请求的目的。在服务器应用程序中,如果每到一个请求就创建一个新线程,然后在新线程中为其请求服务的话,将不可避免的造成系统开销的增大。实际上,创建太多的线程可能会导致由于过度使用系统资源而耗尽内存。为了防止资源不足,服务器应用程序可以采用线程池来限制同一时刻处理的线程数目。线程池不会占用主线程,也不会延迟后续请求的处理。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。第3章习题解答1、使用DNS类和IPHostEntry类创建一个如图3-6所示的域名解析器。用户输入主机名或者DNS域名以后,能在下面的列表框中显示与主机或者DNS域名对应的IP地址和别名。图3-6设计界面【解答】1)主要源程序如下:usingSystem.Net;privatevoidbutton1_Click(objectsender,EventArgse){try{this.Cursor=Cursors.WaitCursor;//解析主机名IPHostEntryIPinfo=Dns.GetHostEntry(textBox1.Text);//清空列表框listBox1.Items.Clear();listBox2.Items.Clear();//显示IP地址foreach(IPAddressIPinIPinfo.AddressList){listBox1.Items.Add(IP.ToString());}//显示别名foreach(stringaliasinIPinfo.Aliases){listBox2.Items.Add(alias);}//显示主机名textBox2.Text=IPinfo.HostName;}catch(Exceptionex){MessageBox.Show(ex.Message);}finally{this.Cursor=Cursors.Default;}}2、参考例3-3的运行界面,编写程序实现获取本机TCP连接统计信息。【解答】1)主要源程序如下:privatevoidFormIPGlobalStatistics_Load(objectsender,EventArgse){IPGlobalPropertiesproperties=IPGlobalProperties.GetIPGlobalProperties();TcpConnectionInformation[]connections=properties.GetActiveTcpConnections();foreach(TcpConnectionInformationtinconnections){listBoxResult.Items.Add(Localendpoint:+t.LocalEndPoint.Address);listBoxResult.Items.Add(Remoteendpoint:+t.RemoteEndPoint.Address);listBoxResult.Items.Add(State:+t.State);}}2)运行结果如图3-7所示。图3-7设计界面3、什么是编码?什么是解码?为什么要对字符进行编码和解码?.NET框架提供了哪些用于字符编码和解码的类?【解答】在网络通信中,很多情况下通信双方传达的都是字符信息。但是,字符信息并不能直接从网络的一端传递到另一端,这些字符信息首先需要被转换成一个字节序列后才能在网络中传输,将字符序列转换为字节序列的过程称为编码。当这些字节传送到网络的接收方时,接收方需反过来将字节序列再转换为字符序列,这种过程称为解码。NETFramework提供了哪些用于字符编码和解码的类有Encoding、Encoder、Decoder。Encoding类位于System.Text命名空间中,主要用于在不同的编码和Unicode之间进行转换。在网络传输和文件操作中,如果数据量比较大,需要划分为较小的块,此时可能出现一个数据块的末尾是一个不匹配的高代理项,而与其匹配的低代理项则位于下一个数据块中。对于这种情况,直接使用Encoding类的GetBytes方法编写程序就比较麻烦。此时,可以利用Encoder类及Decoder类轻松地解决这个问题。4、参考例3-5的运行界面,编写程序利用Encoding类实现编码及解码。【解答】usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net.NetworkInformation;namespaceEncoderDecoderExample{publicpartialclassFormEncoderDecoder:Form{publicFormEncoderDecoder(){InitializeComponent();}privatevoidbuttonRun_Click(objectsender,EventArgse){//编码StringstrCodeType=this.comboBoxType.SelectedItem.ToString();Encodingencoder=Encoding.GetEncoding(strCodeType);Byte[]bytes=encoder.GetBytes(this.textB

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功