1、长沙理工大学网络协议编程课程设计论文周瑞杰学 院 计算机与通信工程 专 业 网络工程 班 级 网络 08-02 学 号 200858080204 学生姓名 周瑞杰 指导教师 王静 课程成绩 完成日期 2011 年 7 月 2 日 课程设计任务书计算机与通信工程学院 网络工程专业 课程名称 网络协议编程课程 设计 时间 20102011 学年第二学期1819 周学生姓名 周瑞杰 指导老师 王静题 目 TCP 和 UDP 数据包发送程序的设计与实现主要内容:(1)掌握 TCP 和 UDP 的概念和工作原理;(2)熟练掌握 C#语言的编程原理;(3)实现基于 TCP 协议的聊天程序设计;(4)实现基
2、于 UDP 协议的聊天程序设计;(5)运行程序,并合理分析实验结果。要求:(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课题设计培养学生严谨的科学态度,认真工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。应当提交的文件:(1)课程设计报告。(2)课程设计附件(主要是源程序) 。课程设计成绩评定学 院 计算机通信工程 专 业 网络工程 班 级 网络 08-02 学 号 200858080204 学生姓名 周瑞杰 指导教师 王静 课程成绩 完成日期 2011 年 7 月 2 日 指导教师对学生在
3、课程设计中的评价评 分 项 目 优 良 中 及 格 不 及 格课程设计中的创造性成果学生掌握课程内容的程度课 程 设 计 完 成 情 况课 程 设 计 动 手 能 力文 字 表 达学 习 态 度规 范 要 求课程设计论文的质量指导教师对课程设计的评定意见综合成绩 指导教师签字 年 月 日TCP 和 UDP 数据包发送程序的设计和实现学生:周瑞杰 指导老师:王静摘要: 在TCP/IP协议族中,传输层主要包括TCP和UDP两种通信协议,它们以不同的方式实现两台主机中的不同程序间之间的数据传输,即数据的端到端传输。TCP提供一种面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性;而UDP提
4、供一种无连接的、不可靠的数据传输方式,但保证了数据传输的实时性。本课程设计用C#语言分别编写了基于TCP的C/S聊天程序和基于UDP的C/S 聊天程序。 经测试,本文程序基本实现了聊天功能,即实现了TCP和UDP数据包发送程序的设计。关键词:TCP 、UDP 、C#、C/S 聊天程序、数据包发送程序Design and Realization of the Sending Program of TCP and UDP PacketsStudent:Zhou Ruijie Instructor:WangJingAbstract: In the TCP / IP protocol clan, th
5、e transport layer mainly includes two communication protocols TCP and UDP, which had achieved the data transmission among different programs between two hosts in different ways, namely the end-to-end data transmission. TCP provides a connection-oriented, reliable data transmission service, ensuring
6、the reliability of the end-to-end data transmission; While UDP provides a connectionless, unreliable way of data transmission, but guaranteeing the data transmission in real-time. This course design has separately written TCP-based C/S chat program and UDP-based C/S chat program in C#. By test, this
7、 paper program has basically achieved chat function, namely realized the design of the sending program of TCP and UDP packets.Keywords:TCP 、UDP 、 C#、C/S chat program 、sending program of packets目录1 引言 .11.1 课程设计的目的 .11.2 本设计任务和主要内容 .12 开发工具及相关技术 .22.1 C#简介 22.2 TCP 和 UDP 概述 22.3 C/S 模式 43 基于 TCP 的 C/
8、S 聊天程序的详细设计 63.1 TCP 设计思路 63.2 客户端编程步骤 83.3 服务器端编程步骤 94 基于 UDP 的 C/S 聊天程序的详细设计 114.1 UDP 设计思路 114.2 客户端编程步骤 124.3 服务器端编程步骤 135 结果分析 145.1 TCP 聊天程序运行结果 145.2 UDP 聊天程序运行结果 175.3 结果分析 176 结束语 187 参考文献 19附录 1:TCP 源程序清单 20附录 2:UDP 源程序清单 33周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 1 页 共 35 页1 引言自进入信息化社会以来,人们的生活发生了翻天覆
9、地的变化,所有这一切的实现都要归功于计算机网络。自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在天涯海角,我们也可以随时联系。一个最简单且应用最广泛的例子网上聊天,就是最好的证明。本课程设计将基于 TCP 和 UDP 协议,使用 C#语言分别实现一个 C/S 聊天程序。1.1 课程设计的目的本次课程设计是用 C#分别编写基于 TCP 和 UDP 协议的 C/S 聊天程序,所以其基本任务就是要实现客户端和服务器端的通信,即客户端和
10、服务器对端能够互相发送数据和接收数据。其中 TCP 是面向连接的协议,所以在客户端和服务器端在通信之前必须先由服务器端监听,客户端发送连接请求,成功建立连接后才能进行通信,这个机制保证了数据传输的可靠性。实现了这个过程,就达到了本次课程设计 TCP 和 UDP 数据包发送程序的设计和实现的目的。1.2 本设计任务和主要内容(1)掌握 TCP 和 UDP 的概念和工作原理;(2)熟练掌握 C#语言的编程原理;(3)实现基于 TCP 协议的聊天程序设计;(4)实现基于 UDP 协议的聊天程序设计;(5)运行程序,并合理分析实验结果。周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 2 页
11、 共 35 页2 开发工具及相关技术2.1 C#简介C#(C Sharp)是微软(Microsoft)为.NET Framework 量身订做的程序语言,C#拥有 C/C+的强大功能以及 Visual Basic 简易使用的特性,是第一个组件导向(Component-oriented)的程序语言,和 C+与 Java 一样亦为对象导向(object-oriented)程序语言。C# 具有以下特点:(1)语法简洁。(2)面向对象设计。(3)与 Web 紧密结合。(4)完整的安全性和错误处理。(5)版本控制。(6)兼容性。(7)灵活性。2.2 TCP 和 UDP 概述在 TCP/IP 协议族中,传
12、输层主要包括 TCP 和 UDP 两种通信协议,它们以不同的方式实现两台主机中的不同应用程序之间的数据传输,即数据的端到端传输。由于它们的实现方式不同,因此各有一套属于自己的端口号,且相互独立。可以采用如下五元组来描述两个应用进程之间的通信关联。 (协议,信源机IP 地址,信源应用进程端口,信宿机 IP 地址,信宿应用进程端口)即端到端之间的一条通信连接就可以表示为上述五元组,这也是进行网络程序设计最基本的概念。 其中,传输控制协议(Transmission Control Protocol,TCP)提供一种面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性。也正因为这样,使 TCP
13、 协议成为传输层最常用的协议,同时也是一个比较复杂的协议,其提供了传输层几乎所有的功能。因此和 IP 协议一样,成为了 TCP/IP 协议族中周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 3 页 共 35 页最重要的协议之一。其主要特点如下:(1)向应用进程提供面向连接的服务,两个需要通过 TCP 协议进行数据传输的应用进程之间首先必须建立一个 TCP 连接,并且在数据传输完成后要释放连接。一般将请求连接的应用进程称为客户进程,而响应连接请求的应用进程称为服务器进程,即 TCP 连接的建立采用的是一种客户机/服务器工作模型。(2)提供全双工数据传输服务,只要建立了 TCP 连接,
14、就能在两个应用进程间进行双向的数据传输服务,但是这种传输只是端到端的传输,不支持广播和多播。 (3)提供面向字节流的服务,即 TCP 协议的数据传输是面向字节流的,两个建立了 TCP 连接的应用进程之间交换的是字节流。发送进程以字节流形式发送数据,接收进程也把数据作为字节流来接收。端到端之间不保留数据记录的边界,也就是说,在传输的层面上不存在数据记录的概念。 用户数据报协议(User Datagram Protocol,UDP)是传输层的两个主要协议之一,相对 TCP 协议来说,UDP 是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。与 TCP 协议不同,UDP 协议是一
15、种无连接的协议,数据在传输之前通信双方不需要建立连接。信宿在收到 UDP 数据报之后也不需要给出任何应答报文。发送方发出的每一个 UDP 用户数据报都是独立的,都携带了完整的目的地址。每个数据报都可以被网络系统独立路由。因此从同一个信源发往同一个信宿的多个 UDP 报文可能选择不同的路径达到信宿,它们达到的先后顺序也可能不同于发送顺序。所以,UDP 协议提供的是一种无连接的、不可靠的数据传输方式,在数据传输过程中没有流量控制和确认机制,数据报可能会丢失、延迟、乱序到达信宿。UDP 协议只是提供了利用校验和检查数据完整性的简单差错控制,属于一种尽力而为的数据传输方式。 虽然 UDP 用户数据报提
16、供不可靠的传输方式,但它具有其自身的一些特点:(1)UDP 是一个无连接协议,传输数据之前信源和信宿不需要建立连接,因此不存在连接建立的时延。在信源端,UDP 传送数据的速度仅仅受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在信宿端,UDP 把每个数据报放在队列中,应用程序每次从队列中读一个数据报。 周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 4 页 共 35 页(2)由于传输数据不需要建立连接,也就不需要维护连接状态,包括收发状态等,这样一台服务机可同时向多个客户机传输相同的数据,例如实现多播。 (3)UDP 数据报的首部很短,只有 8 字节,相对于 TCP 的 2
17、0 字节首部的开销要小很多。(4)吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输带宽、信源和信宿主机性能的限制。 由于 UDP 具有这些特点,有许多应用更适合使用 UDP 协议,如:(1)只需要简单数据交换的应用,例如 DNS 服务,它不需要复杂的可靠性保证机制,这样,利用 UDP 来传输数据既可以节省系统开销又提高了网络的传输效率。 (2)不需要关心数据的差错控制和流量控制的应用。(3)实时性要求较高但可承受一定的数据错误的应用,例如实时语音传输、实时视频通信等。 (4)实现一对多数据发送的应用,例如广播和组播。2.3 C/S 模式在网络连接模式中,除对等网外,还有另一种形式
18、的网络,即客户机/服务器网,Client/Server。在客户机 /服务器网络中,服务器是网络的核心,而客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络必须的资源。 它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到 Client 端和 Server 端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是 Client/Server 形式的两层结构,由于现在的软件应用系统正在向分布式的 Web 应用发展, Web 和 Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可
19、以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S 工作过程如下:服务器端描述:S 端启动服务进程,并监听相应端口。然后,若收到 C 端周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 5 页 共 35 页发出的有关请求,按如下情况给出相应的反映:将收到的包进行检测,若收到的包有错则抛弃(discard ) ,并发给 C 端一个 negtive ACK。若收到的包正常,则将此包进行解包,将内容输出至一临时文件;并发给 C 端一个 positive ACK。依次收到来自 C 端的包,直到收到 end 为止,并关闭此进程,转
20、回监听状态。客户端描述为:若收到的为 Positive ACK,则继续发包;若收到的为 Negtive ACK,则将应发的包重发。直到 C 端将所有要发的包都发完,并都已经收到 S 端的回应,最后发一个 End 包,直接关闭此进程。综上所述,应用中的服务器程序必须先于客户机进程启动,直到对客户机的响应结束或强迫终止。周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 6 页 共 35 页3 基于 TCP 的 C/S 聊天程序的详细设计3.1 TCP 设计思路为了简化编程,.NET 提供面向 TCP 编程的相关类,主要包括 TcpClient 和TcpListener。TcpClient
21、 类为 TCP 网络服务提供客户端连接,它构建于 Socket 类之上,以提供较高级别的 TCP 服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。另外,通过与 NetworkStream 对象的关联,使得用户可以通过流操作方式实现对网络连接状态下数据的发送和接收。通过 TcpClient 类实现与 TCP 主机的通信流程如下图所示:创建T c p C l i e n t 实例利用N e t w o r k S t r e a m 实例发送 和接收数据与远程 主机建立连 接关闭T C P 套 接字图 3-1 TcpClient 类通信流
22、程图周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 7 页 共 35 页TcpClient 类实现了客户端编程抽象,因此构建客户端网络应用程序便可以直接使用 TcpClient 取代 Socket,更加方便易用。同样,对于服务器端应用程序的构建,C# 提供了 TcpListener 类。该类也是构建于 Socket 之上,提供了更高抽象级别的 TCP 服务,使得程序员能更方便地编写服务器端应用程序。通常情况下,服务器端应用程序在启动时将首先绑定本地网络接口的 IP 地址和端口号,然后进入侦听客户请求的状态,以便于客户端应用程序提出显式请求。一旦侦听到有客户端应用程序请求连接侦听端口
23、,服务器端应用将接受请求,并建立一个负责与客户端应用程序通信的信道,即通过创建连接套接字与客户端应用程序建立连接,由连接套接字完成与客户端应用程序的数据传送操作,服务器端应用程序继续侦听更多的客户端连接请求。TcpListener 通过实例创建过程完成与本地网络接口的绑定,并由所创建的实例调用 Start 方法启动侦听;当侦听到客户端应用程序的连接请求后,根据客户端应用程序的不同请求方式,可以通过 AcceptTcpClient 方法接受传入的连接请求并创建 TcpClient实例以处理请求,或者通过 AcceptSocket 方法接受传入的连接请求并创建Socket 实例以处理请求,并由所创
24、建的 TcpClient 实例或 Socket 实例完成与客户端应用程序的网络数据传输。最后,需要使用 Stop 关闭用于侦听传入连接的Socket,同时也必须关闭从 AcceptSocket 或 AcceptTcpClient 返回的任何实例,以释放相关资源。其实现流程如下图所示:周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 8 页 共 35 页创建T c p L i s t e n e r 实例侦听停 止服务接收 连接请求收发数据图 3-2 TcpListener 类通信流程图3.2 客户端编程步骤(1)新建一个客户端窗口程序:FormClient(2)对窗口程序进行界面设计
25、,由于功能比较简单,并没有做做到尽善尽美,只是做到简单的通信与显示信息,主要用到了三个主要空间:LlistBoxStatus,TextBox,Button,其中,LlistBoxStatus 用来显示与服务器端的连接状态,两个 TextBox 分别表示接收的信息和准备发送的信息,两个 Button分别用来表示连接和发送。将各控件的名字改为有实际意义,容易标记的名字。(3)核心代码编写进入编写代码模式,在开头中添加所要用到的命名空间如:using System.Net; /提供一个统一、简单的编程接口using System.Net.Sockets;/提供Windows套接字接口的托管实现usi
26、ng System.Threading;/提供类和接口支持线程程序设计所需实现功能周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 9 页 共 35 页如下代码描述了 TcpClient 实例的创建以及与指定远程主机的连接过程。client = new TcpClient(AddressFamily.InterNetwork);/创建实例client.BeginConnect(serverIP0, 51888, requestCallback, client);listBoxStatus.Invoke(setListBoxCallback, string.Format(“本机EndP
27、oint:0“,client.Client.LocalEndPoint);listBoxStatus.Invoke(setListBoxCallback, “开始与服务器建立连接“);与远程主机连接成功后,利用 NetworkStream 实例发送和接收数据。该方法首先通过 client.GetStream 来返回 NetWorkStream 实例,进而利用所获取的NetworkStream 实例的读写方法 Write 和 Read 来发送和接收数据,其实现代码如下所示:try/获取连接成功后得到的状态参数client = (TcpClient)ar.AsyncState;/异步接受传入的连接
28、尝试,使BeginConnect正常结束client.EndConnect(ar);listBoxStatus.Invoke(setListBoxCallback,string.Format(“与服务器0连接成功“, client.Client.RemoteEndPoint);/获取接收和发送数据的网络流networkStream = client.GetStream();/接收服务器发送的数据,BeginRead完成后,会自动调用ReadCallbackReadObject readObject =new ReadObject(networkStream, client.ReceiveBuf
29、ferSize);networkStream.BeginRead(readObject.bytes,0, readObject.bytes.Length, ReadCallback, readObject);/ allDone.WaitOne();在与服务器完成通信后,应该调用 Close( )方法释放所有的资源。3.3 服务器端编程步骤(1)新建一个服务器端窗口程序:FormServer(2)对窗口程序进行界面设计,由于功能比较简单,并没有做做到尽善尽美,只是做到简单的通信与显示信息,主要用到了三个主要空间:LlistBoxStatus,TextBox,Button,其中,LlistBoxS
30、tatus 用来显示与客户端的连接状态,两个 TextBox 分别表示接收的信息和准备发送的信息,三个 Button 分周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 10 页 共 35 页别用来表示开始监听、停止监听和发送。将各控件的名字改为有实际意义,容易标记的名字。(3)核心代码编写进入编写代码模式,在开头中添加所要用到的命名空间如:using System.Net; /提供一个统一、简单的编程接口using System.Net.Sockets;/提供Windows套接字接口的托管实现using System.Threading;/提供类和接口支持线程程序设计所需实现功能创
31、建 TcpListener 实例,调用 Start 方法启动侦听,即该方法调用TcpListener 实例的基础 Socket 上的 Listen 方法,开始侦听客户的连接请求,代码如下:private void AcceptConnect()/获取本机所有IP地址IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName();listener = new TcpListener(ip0, 51888);/创建实例listener.Start();/开始侦听当侦听到有客户连接请求时,使用 AcceptTcpClient接收任何当前在队列中挂起的连接请
32、求,并返回一个 TcpClient实例以接受客户的连接请求,如下面代码所示:private void AcceptTcpClientCallback(IAsyncResult ar)try/将事件状态设为终止状态,允许一个或多个等待线程继续allDone.Set();TcpListener myListener = (TcpListener)ar.AsyncState;/异步接收传入的连接,创建新的TcpClient对象处理远程主机通信TcpClient client = myListener.EndAcceptTcpClient(ar);listBoxStatus.Invoke(setLis
33、tBoxCallback, “已接受客户连接:“ + client.Client.RemoteEndPoint);comboBox1.Invoke(setComboBoxCallback,client.Client.RemoteEndPoint.ToString();ReadWriteObject readWriteObject=new ReadWriteObject(client);clientList.Add(readWriteObject);SendString(readWriteObject, “服务器已经接受连接,请通话!“);周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现
34、第 11 页 共 35 页由于返回的是 TcpClient实例,所以可以通过对 NetworkStream的读写来实现与客户的通信。在这里引入了多线程技术,为每个客户的连接建立一个线程,在该线程中实现与客户的数据通信,代码如下:ThreadStart ts = new ThreadStart(AcceptConnect);/客户连接Thread myThread = new Thread(ts);/创建线程myThread.Start();/启动线程与客户程序通信完成之后,最后一步是停止监听套接字,调用TcpListener的 Stop方法来实现private void FormServer_
35、FormClosing(object sender, FormClosingEventArgs e)buttonStop_Click(null, null);4 基于 UDP 的 C/S 聊天程序的详细设计4.1 UDP 设计思路UdpClient 类是基于 Socket 类的较高级别抽象,提供了较高级别的 UDP 服务。在.NET 环境中基于 UDP 协议的网络程序设计可以直接用 UdpClient 类。 用于在阻止同步模式下发送和接收无连接 UDP 数据报,使用简单直观。基于 UdpClient 的网络应用编程首先需要创建一个 UdpClient 类实例,接着周瑞杰 TCP 和 UDP 数
36、据包发送程序的设计和实现 第 12 页 共 35 页通过调用其 Connect 方法连接到远程主机。当然,这两步也可以直接由指定远程主机名和端口号的 UdpClient 类构造函数完成。然后便可以利用 Send 和Receive 方法来发送和接收数据。最后调用 Close 方法关闭 UDP 连接,并释放相关资源。其实现流程如下图所示: 创建U d p C l i e n t 实例发 送?发送关闭接收连接Y e s N o图 4-1 基于 UdpClient 的编程流程图基于 UDP 的 C/S 聊天程序相对基于 TCP 的 C/S 聊天程序来说实现比较简单,因为 UDP 不需要建立连接,而且在
37、设计程序时没有创建窗口,而是直接开始编程。分别编写客户端和服务器端的 C#程序。4.2 客户端编程步骤启动 Visual Studio2008,选择【文件】|【新建】| 【项目】命令,弹出【新建项目】对话框,在左侧【项目类型】列表中选择【Visual C# 】 ,在右侧【模板】列表框中选择【控制台应用程序】 ,在【名称】文本框中输入“UDPClient” ,在【位置】文本框中输入项目保存路径,单击【确定】按钮。然后在项目中编周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 13 页 共 35 页写程序。首先需要引入命名空间:using System.Net;using System.
38、Net.Sockets;在编写客户端程序时,创建 UDPClient 实例并指定连接信息后,就开始设计数据的发送和接收,使用 send 方法来完成数据发送操作。其中核心代码如下面所示:/设置服务 IP,设置 TCP 端口号IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(“127.0.0.1“), 8001);/定义网络类型,数据连接类型和网络协议 UDPSocket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);/客户端向服
39、务器端发送的第一个数据包string welcome = “Hello! “; data = Encoding.ASCII.GetBytes(welcome);/在指定了连接信息后,直接给出数据及其长度进行发送server.SendTo(data, data.Length, SocketFlags.None, ipep);/将 UDP 数据报发送到指定的主机上的指定端口IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;data = new byte1024;/接收数据,
40、数据来自远方的 Remoteint recv = server.ReceiveFrom(data, ref Remote);使用 UDPClient 的最后一步是关闭连接,在这里直接调用 UDPClient 的Close 方法来实现。4.3 服务器端编程步骤启动 Visual Studio2008,选择【文件】|【新建】| 【项目】命令,弹出【新建项目】对话框,在左侧【项目类型】列表中选择【Visual C# 】 ,在右侧【模板】列表框中选择【控制台应用程序】 ,在【名称】文本框中输入“UDPServer” ,在【位置】文本框中输入与客户端相同的保存路径,单击【确定】按钮。然后在项目中编写程序
41、。同样的,在服务器端编程时也需要引入如下命名空间:using System.Net;周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 14 页 共 35 页using System.Net.Sockets;整个程序的核心代码如下/构建 TCP 服务器 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001);/得到本机 IP,设置 TCP 端口号Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);/绑定网
42、络地址newsock.Bind(ipep);while (true)data = new byte1024;/接受信息recv = newsock.ReceiveFrom(data, ref Remote);/发送信息newsock.SendTo(Encoding.ASCII.GetBytes(input), Remote);/newsock.SendTo(data, recv, SocketFlags.None, Remote);客户端和服务器端程序都编写好后,经过调试和运行,就可以实现简单的通信了,结果将在后面部分进行分析。5 结果分析5.1 TCP 聊天程序运行结果初始界面如下所示:周瑞
43、杰 TCP 和 UDP 数据包发送程序的设计和实现 第 15 页 共 35 页图 5-1 服务器端初始界面图图 5-2 客户端初始界面图服务器端首先“开始监听” ,客户端打开“连接”按钮,服务器端监听到客户端的链接请求后,会显示下面的的结果:周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 16 页 共 35 页图 5-3 服务器端成功监听到客户端的连接请求情况图图 5-4 客户端成功连接到服务器端情况图客户端和服务器端进行连接后,可以进行正常的聊天了。客户端与服务器周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 17 页 共 35 页端通话情况如下图所示:图 5-5 实
44、现通信后的服务器端界面图图 5-6 实现通信后的客户器端界面图周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 18 页 共 35 页5.2 UDP 聊天程序运行结果运行程序后,初始界面如下:图 5-7 服务器端初始界面图图 5-8 客户端初始界面图图 5-9 通信后的客户端界面图图 5-10 通信后的服务器端界面图5.3 结果分析根据以上程序的执行情况可知,服务器端和客户端实现成功的连接。根据客户端和服务器端的通信状况可知,所设计的聊天程序符合要求,达到了预期的目标。周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 19 页 共 35 页6 结束语本次课程设计是利用 C#
45、编写的,经过这两周的学习,我受益匪浅。首先,我复习了之前学的 C#网络编程知识,弄懂了 C#编程的方法和规则。其次,更加全面的了解并掌握 TCP 和 UDP 这两个网络层协议的概念和工作原理。本次课程设计分别实现了一个 TCP 的 C/S 聊天程序和一个 UDP 的 C/S 聊天程序。从一点点思想到流程图再到整个程序的编写,调试,无一不花费了我许多的精力。看着自己的劳动果实,反倒十分的欣慰,更认识到自己的不足。今后的学习过程中要不断的积累经验,开阔思维以得到提高。总之,课程设计的过程就是一个汲取知识的过程,从中受益匪浅,通过这次课程设计使我懂得了理论与实践相结合的重要性,只有理论知识是远远不够
46、的,只有把所学的理论知识与实践结合起来,从实践中得出结论,才能真正的提高。同时,也使我认识到自己动手能力太差,为我以后的学习和发展敲了一个警钟!本次课程设计的过程中,虽然遇到了不少问题,但最后还是成功的完成了,这得益于老师的指导和同学们的帮助,同时,也使我充分体验到了团结的重要性。最后,在这里我要感谢学校为我们提供这次锻炼的机会,同时也感谢各位老师对我的指导和同学们的帮助,希望以后能多有这样的锻炼机会。周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 20 页 共 35 页7 参考文献1 谢希仁. 算机网络M. 4 版. 北京:电子工业出版社, 2003.2 金华,华进. C#网络编
47、程技术教程. 北京:人民邮电出版社,2003.3 雷震甲. 计算机网络管理. 西安:西安电子科技大学出版社,2005.4 郑宇军,王侃. C#语言程序设计基础. 北京:清华大学出版社,2008.5 殷肖川 刘志宏.网络编程与开发技术. 西安:西安交通大学出版社. 2005.周瑞杰 TCP 和 UDP 数据包发送程序的设计和实现 第 21 页 共 35 页附录 1:TCP 源程序清单/ 程序名称:TCP 和 UDP 数据包发送程序/ 程序功能:用#实现 TCP 和 UDP 的 C/S 聊天程序。/ 程序作者:周瑞杰/ 最后修改日期:2011-7-2Tcp 服务器端源程序/-FormServr.c
48、s-/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;/添加的命名空间using System.Net;using System.Net.Sockets;using System.Threading;using System.IO;namespace AsyncTcpServerpublic partial class FormServer : Formprivate bool isExit = false;/保存连接的所有客户端System.Collections.ArrayList clientList = new System.Collections.ArrayList();TcpListener listener;/用于线程间互操作private delegate void SetListBoxCallback(string str);private SetListBoxCallback setListBoxCallback;private delegate void SetRichT