TCP和UDP数据包发送程序的设计和实现(C#)

上传人:少*** 文档编号:59568970 上传时间:2022-03-03 格式:DOC 页数:42 大小:883.50KB
收藏 版权申诉 举报 下载
TCP和UDP数据包发送程序的设计和实现(C#)_第1页
第1页 / 共42页
TCP和UDP数据包发送程序的设计和实现(C#)_第2页
第2页 / 共42页
TCP和UDP数据包发送程序的设计和实现(C#)_第3页
第3页 / 共42页
资源描述:

《TCP和UDP数据包发送程序的设计和实现(C#)》由会员分享,可在线阅读,更多相关《TCP和UDP数据包发送程序的设计和实现(C#)(42页珍藏版)》请在装配图网上搜索。

1、长沙理工大学网络协议编程课程设计论文周瑞杰学 院 计算机与通信工程 专 业 网络工程 班 级 网络08-02 学 号 200858080204 学生姓名 周瑞杰 指导教师 王静 课程成绩 完成日期 2011年7月2日 课程设计任务书计算机与通信工程学院 网络工程专业 课程名称网络协议编程课程设计时间20102011学年第二学期1819周学生姓名周瑞杰指导老师王静题 目TCP和UDP数据包发送程序的设计与实现主要内容:(1)掌握TCP和UDP的概念和工作原理;(2)熟练掌握C#语言的编程原理;(3)实现基于TCP协议的聊天程序设计;(4)实现基于UDP协议的聊天程序设计; (5)运行程序,并合理

2、分析实验结果。要求:(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课题设计培养学生严谨的科学态度,认真工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。应当提交的文件:(1)课程设计报告。(2)课程设计附件(主要是源程序)。课程设计成绩评定学 院 计算机通信工程 专 业 网络工程 班 级 网络08-02 学 号 200858080204 学生姓名 周瑞杰 指导教师 王静 课程成绩 完成日期 2011年7月2日 指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌

3、握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量指导教师对课程设计的评定意见综合成绩 指导教师签字 年 月 日TCP和UDP数据包发送程序的设计和实现学生:周瑞杰 指导老师:王静摘要: 在TCP/IP协议族中,传输层主要包括TCP和UDP两种通信协议,它们以不同的方式实现两台主机中的不同程序间之间的数据传输,即数据的端到端传输。TCP提供一种面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性;而UDP提供一种无连接的、不可靠的数据传输方式,但保证了数据传输的实时性。本课程设计用C#语言分别编写了基于TCP的C/S聊天程序和基于UDP的C/S聊

4、天程序。经测试,本文程序基本实现了聊天功能,即实现了TCP和UDP数据包发送程序的设计。关键词:TCP、UDP、C#、C/S聊天程序、数据包发送程序Design and Realization of the Sending Program of TCP and UDP Packets Student:Zhou Ruijie Instructor:WangJingAbstract: In the TCP / IP protocol clan, the transport layer mainly includes two communication protocols TCP and UDP,

5、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 the reliability of the end-to-end data transmission; While UDP provides a c

6、onnectionless, 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 paper program has basically achieved chat function, namely realized the de

7、sign 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/S聊天程序的详细设计63.1 TCP设计思路63.2 客户端编程步骤83.3 服务器端编程步骤94 基于UDP的C/S聊天程序的详细设计114.1 UDP设计思路114.2 客户端编程步骤124

8、.3 服务器端编程步骤135 结果分析145.1 TCP聊天程序运行结果145.2 UDP聊天程序运行结果175.3 结果分析176 结束语187 参考文献19附录1:TCP源程序清单20附录2:UDP源程序清单33周瑞杰 TCP和UDP数据包发送程序的设计和实现 第 37页 共35页1引言自进入信息化社会以来,人们的生活发生了翻天覆地的变化,所有这一切的实现都要归功于计算机网络。自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在

9、天涯海角,我们也可以随时联系。一个最简单且应用最广泛的例子网上聊天,就是最好的证明。本课程设计将基于TCP和UDP协议,使用C#语言分别实现一个C/S聊天程序。1.1课程设计的目的本次课程设计是用C#分别编写基于TCP和UDP协议的C/S聊天程序,所以其基本任务就是要实现客户端和服务器端的通信,即客户端和服务器对端能够互相发送数据和接收数据。其中TCP是面向连接的协议,所以在客户端和服务器端在通信之前必须先由服务器端监听,客户端发送连接请求,成功建立连接后才能进行通信,这个机制保证了数据传输的可靠性。实现了这个过程,就达到了本次课程设计TCP和UDP数据包发送程序的设计和实现的目的。1.2本设

10、计任务和主要内容(1)掌握TCP和UDP的概念和工作原理;(2)熟练掌握C#语言的编程原理;(3)实现基于TCP协议的聊天程序设计;(4)实现基于UDP协议的聊天程序设计;(5)运行程序,并合理分析实验结果。 2开发工具及相关技术2.1 C#简介C#(C Sharp)是微软(Microsoft)为.NET Framework量身订做的程序语言,C#拥有C/C+的强大功能以及Visual Basic简易使用的特性,是第一个组件导向(Component-oriented)的程序语言,和C+与Java一样亦为对象导向(object-oriented)程序语言。C#具有以下特点:(1)语法简洁。(2)

11、面向对象设计。(3)与Web紧密结合。(4)完整的安全性和错误处理。(5)版本控制。(6)兼容性。(7)灵活性。2.2 TCP和UDP概述在TCP/IP协议族中,传输层主要包括TCP和UDP两种通信协议,它们以不同的方式实现两台主机中的不同应用程序之间的数据传输,即数据的端到端传输。由于它们的实现方式不同,因此各有一套属于自己的端口号,且相互独立。可以采用如下五元组来描述两个应用进程之间的通信关联。(协议,信源机IP地址,信源应用进程端口,信宿机IP地址,信宿应用进程端口)即端到端之间的一条通信连接就可以表示为上述五元组,这也是进行网络程序设计最基本的概念。 其中,传输控制协议(Transmi

12、ssion Control Protocol,TCP)提供一种面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性。也正因为这样,使TCP协议成为传输层最常用的协议,同时也是一个比较复杂的协议,其提供了传输层几乎所有的功能。因此和IP协议一样,成为了TCP/IP协议族中最重要的协议之一。其主要特点如下:(1)向应用进程提供面向连接的服务,两个需要通过TCP协议进行数据传输的应用进程之间首先必须建立一个TCP连接,并且在数据传输完成后要释放连接。一般将请求连接的应用进程称为客户进程,而响应连接请求的应用进程称为服务器进程,即TCP连接的建立采用的是一种客户机/服务器工作模型。(2)提供全

13、双工数据传输服务,只要建立了TCP连接,就能在两个应用进程间进行双向的数据传输服务,但是这种传输只是端到端的传输,不支持广播和多播。 (3)提供面向字节流的服务,即TCP协议的数据传输是面向字节流的,两个建立了TCP连接的应用进程之间交换的是字节流。发送进程以字节流形式发送数据,接收进程也把数据作为字节流来接收。端到端之间不保留数据记录的边界,也就是说,在传输的层面上不存在数据记录的概念。 用户数据报协议(User Datagram Protocol,UDP)是传输层的两个主要协议之一,相对TCP协议来说,UDP是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。与TCP协议

14、不同,UDP协议是一种无连接的协议,数据在传输之前通信双方不需要建立连接。信宿在收到UDP数据报之后也不需要给出任何应答报文。发送方发出的每一个UDP用户数据报都是独立的,都携带了完整的目的地址。每个数据报都可以被网络系统独立路由。因此从同一个信源发往同一个信宿的多个UDP报文可能选择不同的路径达到信宿,它们达到的先后顺序也可能不同于发送顺序。所以,UDP协议提供的是一种无连接的、不可靠的数据传输方式,在数据传输过程中没有流量控制和确认机制,数据报可能会丢失、延迟、乱序到达信宿。UDP协议只是提供了利用校验和检查数据完整性的简单差错控制,属于一种尽力而为的数据传输方式。 虽然UDP用户数据报提

15、供不可靠的传输方式,但它具有其自身的一些特点:(1)UDP是一个无连接协议,传输数据之前信源和信宿不需要建立连接,因此不存在连接建立的时延。在信源端,UDP传送数据的速度仅仅受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在信宿端,UDP把每个数据报放在队列中,应用程序每次从队列中读一个数据报。 (2)由于传输数据不需要建立连接,也就不需要维护连接状态,包括收发状态等,这样一台服务机可同时向多个客户机传输相同的数据,例如实现多播。 (3)UDP数据报的首部很短,只有8字节,相对于TCP的20字节首部的开销要小很多。(4)吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输带宽

16、、信源和信宿主机性能的限制。 由于UDP具有这些特点,有许多应用更适合使用UDP协议,如:(1)只需要简单数据交换的应用,例如DNS服务,它不需要复杂的可靠性保证机制,这样,利用UDP来传输数据既可以节省系统开销又提高了网络的传输效率。 (2)不需要关心数据的差错控制和流量控制的应用。(3)实时性要求较高但可承受一定的数据错误的应用,例如实时语音传输、实时视频通信等。 (4)实现一对多数据发送的应用,例如广播和组播。2.3 C/S模式在网络连接模式中,除对等网外,还有另一种形式的网络,即客户机/服务器网,Client/Server。在客户机/服务器网络中,服务器是网络的核心,而客户机是网络的基

17、础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络必须的资源。 它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到 Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S工作过程如下:服务器端描述

18、:S端启动服务进程,并监听相应端口。然后,若收到C端发出的有关请求,按如下情况给出相应的反映:将收到的包进行检测,若收到的包有错则抛弃(discard),并发给C端一个negtive ACK。若收到的包正常,则将此包进行解包,将内容输出至一临时文件;并发给C端一个positive ACK。依次收到来自C端的包,直到收到end为止,并关闭此进程,转回监听状态。客户端描述为:若收到的为Positive ACK,则继续发包;若收到的为Negtive ACK,则将应发的包重发。直到C端将所有要发的包都发完,并都已经收到S端的回应,最后发一个End包,直接关闭此进程。综上所述,应用中的服务器程序必须先于

19、客户机进程启动,直到对客户机的响应结束或强迫终止。3 基于TCP的C/S聊天程序的详细设计3.1 TCP设计思路为了简化编程,.NET提供面向TCP编程的相关类,主要包括TcpClient和TcpListener。TcpClient类为TCP网络服务提供客户端连接,它构建于Socket类之上,以提供较高级别的TCP服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。另外,通过与NetworkStream对象的关联,使得用户可以通过流操作方式实现对网络连接状态下数据的发送和接收。通过TcpClient类实现与TCP主机的通信流程如下图所示:

20、 图3-1 TcpClient类通信流程图TcpClient类实现了客户端编程抽象,因此构建客户端网络应用程序便可以直接使用TcpClient取代Socket,更加方便易用。同样,对于服务器端应用程序的构建,C#提供了TcpListener类。该类也是构建于Socket之上,提供了更高抽象级别的TCP服务,使得程序员能更方便地编写服务器端应用程序。通常情况下,服务器端应用程序在启动时将首先绑定本地网络接口的IP地址和端口号,然后进入侦听客户请求的状态,以便于客户端应用程序提出显式请求。一旦侦听到有客户端应用程序请求连接侦听端口,服务器端应用将接受请求,并建立一个负责与客户端应用程序通信的信道,

21、即通过创建连接套接字与客户端应用程序建立连接,由连接套接字完成与客户端应用程序的数据传送操作,服务器端应用程序继续侦听更多的客户端连接请求。TcpListener通过实例创建过程完成与本地网络接口的绑定,并由所创建的实例调用Start方法启动侦听;当侦听到客户端应用程序的连接请求后,根据客户端应用程序的不同请求方式,可以通过AcceptTcpClient方法接受传入的连接请求并创建TcpClient实例以处理请求,或者通过AcceptSocket方法接受传入的连接请求并创建Socket实例以处理请求,并由所创建的TcpClient实例或Socket实例完成与客户端应用程序的网络数据传输。最后,

22、需要使用Stop关闭用于侦听传入连接的Socket,同时也必须关闭从AcceptSocket或AcceptTcpClient返回的任何实例,以释放相关资源。其实现流程如下图所示: 图3-2 TcpListener 类通信流程图3.2 客户端编程步骤(1)新建一个客户端窗口程序:FormClient(2)对窗口程序进行界面设计,由于功能比较简单,并没有做做到尽善尽美,只是做到简单的通信与显示信息,主要用到了三个主要空间:LlistBoxStatus,TextBox,Button,其中,LlistBoxStatus用来显示与服务器端的连接状态,两个TextBox分别表示接收的信息和准备发送的信息,

23、两个Button分别用来表示连接和发送。将各控件的名字改为有实际意义,容易标记的名字。(3)核心代码编写进入编写代码模式,在开头中添加所要用到的命名空间如:using System.Net; /提供一个统一、简单的编程接口using System.Net.Sockets;/提供Windows套接字接口的托管实现using System.Threading;/提供类和接口支持线程程序设计所需实现功能如下代码描述了TcpClient实例的创建以及与指定远程主机的连接过程。client = new TcpClient(AddressFamily.InterNetwork);/创建实例client.B

24、eginConnect(serverIP0, 51888, requestCallback, client);listBoxStatus.Invoke(setListBoxCallback, string.Format(本机EndPoint:0,client.Client.LocalEndPoint);listBoxStatus.Invoke(setListBoxCallback, 开始与服务器建立连接);与远程主机连接成功后,利用NetworkStream实例发送和接收数据。该方法首先通过client.GetStream来返回NetWorkStream实例,进而利用所获取的NetworkSt

25、ream实例的读写方法Write和Read来发送和接收数据,其实现代码如下所示:try /获取连接成功后得到的状态参数 client = (TcpClient)ar.AsyncState; /异步接受传入的连接尝试,使BeginConnect正常结束 client.EndConnect(ar); listBoxStatus.Invoke(setListBoxCallback, string.Format(与服务器0连接成功, client.Client.RemoteEndPoint); /获取接收和发送数据的网络流 networkStream = client.GetStream(); /接收

26、服务器发送的数据,BeginRead完成后,会自动调用ReadCallback ReadObject readObject =new ReadObject(networkStream, client.ReceiveBufferSize); networkStream.BeginRead(readObject.bytes, 0, readObject.bytes.Length, ReadCallback, readObject); / allDone.WaitOne(); 在与服务器完成通信后,应该调用Close()方法释放所有的资源。3.3 服务器端编程步骤(1)新建一个服务器端窗口程序:Fo

27、rmServer(2)对窗口程序进行界面设计,由于功能比较简单,并没有做做到尽善尽美,只是做到简单的通信与显示信息,主要用到了三个主要空间:LlistBoxStatus,TextBox,Button,其中,LlistBoxStatus用来显示与客户端的连接状态,两个TextBox分别表示接收的信息和准备发送的信息,三个Button分别用来表示开始监听、停止监听和发送。将各控件的名字改为有实际意义,容易标记的名字。(3)核心代码编写进入编写代码模式,在开头中添加所要用到的命名空间如:using System.Net; /提供一个统一、简单的编程接口using System.Net.Sockets

28、;/提供Windows套接字接口的托管实现using System.Threading;/提供类和接口支持线程程序设计所需实现功能创建TcpListener实例,调用Start方法启动侦听,即该方法调用TcpListener实例的基础Socket上的Listen方法,开始侦听客户的连接请求,代码如下:private void AcceptConnect() /获取本机所有IP地址 IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName(); listener = new TcpListener(ip0, 51888);/创建实例 listener

29、.Start();/开始侦听当侦听到有客户连接请求时,使用AcceptTcpClient接收任何当前在队列中挂起的连接请求,并返回一个TcpClient实例以接受客户的连接请求,如下面代码所示:private void AcceptTcpClientCallback(IAsyncResult ar) try /将事件状态设为终止状态,允许一个或多个等待线程继续 allDone.Set(); TcpListener myListener = (TcpListener)ar.AsyncState;/异步接收传入的连接,创建新的TcpClient对象处理远程主机通信 TcpClient client

30、 = myListener.EndAcceptTcpClient(ar);listBoxStatus.Invoke(setListBoxCallback, 已接受客户连接: + client.Client.RemoteEndPoint); comboBox1.Invoke(setComboBoxCallback, client.Client.RemoteEndPoint.ToString(); ReadWriteObject readWriteObject=new ReadWriteObject(client); clientList.Add(readWriteObject); SendStr

31、ing(readWriteObject, 服务器已经接受连接,请通话!); 由于返回的是TcpClient实例,所以可以通过对NetworkStream的读写来实现与客户的通信。在这里引入了多线程技术,为每个客户的连接建立一个线程,在该线程中实现与客户的数据通信,代码如下:ThreadStart ts = new ThreadStart(AcceptConnect);/客户连接Thread myThread = new Thread(ts);/创建线程myThread.Start();/启动线程与客户程序通信完成之后,最后一步是停止监听套接字,调用TcpListener的Stop方法来实现pr

32、ivate void FormServer_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类实例,接着通过调用其Conne

33、ct方法连接到远程主机。当然,这两步也可以直接由指定远程主机名和端口号的UdpClient类构造函数完成。然后便可以利用Send和Receive方法来发送和接收数据。最后调用Close方法关闭UDP连接,并释放相关资源。其实现流程如下图所示: 图4-1 基于UdpClient的编程流程图基于UDP的C/S聊天程序相对基于TCP的C/S聊天程序来说实现比较简单,因为UDP不需要建立连接,而且在设计程序时没有创建窗口,而是直接开始编程。分别编写客户端和服务器端的C#程序。4.2 客户端编程步骤启动Visual Studio2008,选择【文件】|【新建】|【项目】命令,弹出【新建项目】对话框,在左

34、侧【项目类型】列表中选择【Visual C#】,在右侧【模板】列表框中选择【控制台应用程序】,在【名称】文本框中输入“UDPClient” ,在【位置】文本框中输入项目保存路径,单击【确定】按钮。然后在项目中编写程序。首先需要引入命名空间:using System.Net;using System.Net.Sockets;在编写客户端程序时,创建UDPClient实例并指定连接信息后,就开始设计数据的发送和接收,使用send方法来完成数据发送操作。其中核心代码如下面所示:/设置服务IP,设置TCP端口号IPEndPoint ipep = new IPEndPoint(IPAddress.Par

35、se(127.0.0.1), 8001);/定义网络类型,数据连接类型和网络协议UDPSocket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);/客户端向服务器端发送的第一个数据包string welcome = Hello! ; data = Encoding.ASCII.GetBytes(welcome);/在指定了连接信息后,直接给出数据及其长度进行发送server.SendTo(data, data.Length, SocketFlags.None, ipep);

36、/将UDP数据报发送到指定的主机上的指定端口IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;data = new byte1024;/接收数据,数据来自远方的Remoteint recv = server.ReceiveFrom(data, ref Remote);使用UDPClient的最后一步是关闭连接,在这里直接调用UDPClient的Close方法来实现。4.3 服务器端编程步骤启动Visual Studio2008,选择【文件】|【新建】|【项目】命令,弹出

37、【新建项目】对话框,在左侧【项目类型】列表中选择【Visual C#】,在右侧【模板】列表框中选择【控制台应用程序】,在【名称】文本框中输入“UDPServer” ,在【位置】文本框中输入与客户端相同的保存路径,单击【确定】按钮。然后在项目中编写程序。同样的,在服务器端编程时也需要引入如下命名空间:using System.Net;using System.Net.Sockets; 整个程序的核心代码如下/构建TCP 服务器 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001);/得到本机IP,设置TCP端口号Socket newsock

38、= new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);/绑定网络地址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, Rem

39、ote); 客户端和服务器端程序都编写好后,经过调试和运行,就可以实现简单的通信了,结果将在后面部分进行分析。5 结果分析5.1 TCP聊天程序运行结果初始界面如下所示:图5-1 服务器端初始界面图图5-2 客户端初始界面图服务器端首先“开始监听”,客户端打开“连接”按钮,服务器端监听到客户端的链接请求后,会显示下面的的结果:图5-3 服务器端成功监听到客户端的连接请求情况图图5-4 客户端成功连接到服务器端情况图客户端和服务器端进行连接后,可以进行正常的聊天了。客户端与服务器端通话情况如下图所示:图5-5 实现通信后的服务器端界面图图5-6 实现通信后的客户器端界面图5.2 UDP聊天程序运

40、行结果运行程序后,初始界面如下:图5-7 服务器端初始界面图图5-8 客户端初始界面图图5-9 通信后的客户端界面图图5-10 通信后的服务器端界面图5.3 结果分析根据以上程序的执行情况可知,服务器端和客户端实现成功的连接。根据客户端和服务器端的通信状况可知,所设计的聊天程序符合要求,达到了预期的目标。6 结束语本次课程设计是利用C#编写的,经过这两周的学习,我受益匪浅。首先,我复习了之前学的C#网络编程知识,弄懂了C#编程的方法和规则。其次,更加全面的了解并掌握TCP和UDP这两个网络层协议的概念和工作原理。本次课程设计分别实现了一个TCP的C/S聊天程序和一个UDP的C/S聊天程序。从一

41、点点思想到流程图再到整个程序的编写,调试,无一不花费了我许多的精力。看着自己的劳动果实,反倒十分的欣慰,更认识到自己的不足。今后的学习过程中要不断的积累经验,开阔思维以得到提高。总之,课程设计的过程就是一个汲取知识的过程,从中受益匪浅,通过这次课程设计使我懂得了理论与实践相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践结合起来,从实践中得出结论,才能真正的提高。同时,也使我认识到自己动手能力太差,为我以后的学习和发展敲了一个警钟!本次课程设计的过程中,虽然遇到了不少问题,但最后还是成功的完成了,这得益于老师的指导和同学们的帮助,同时,也使我充分体验到了团结的重要性。最后,在

42、这里我要感谢学校为我们提供这次锻炼的机会,同时也感谢各位老师对我的指导和同学们的帮助,希望以后能多有这样的锻炼机会。7 参考文献1谢希仁. 算机网络M. 4版. 北京:电子工业出版社, 2003.2金华,华进. C#网络编程技术教程. 北京:人民邮电出版社,2003.3雷震甲. 计算机网络管理. 西安:西安电子科技大学出版社,2005.4郑宇军,王侃. C#语言程序设计基础. 北京:清华大学出版社,2008.5殷肖川 刘志宏.网络编程与开发技术. 西安:西安交通大学出版社. 2005.附录1:TCP源程序清单/ 程序名称:TCP和UDP数据包发送程序/ 程序功能:用#实现TCP和UDP的C/S

43、聊天程序。/ 程序作者:周瑞杰/ 最后修改日期:2011-7-2Tcp服务器端源程序/-FormServr.cs-/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 Syste

44、m.IO;namespace AsyncTcpServer public partial class FormServer : Form private bool isExit = false; /保存连接的所有客户端 System.Collections.ArrayList clientList = new System.Collections.ArrayList(); TcpListener listener; /用于线程间互操作 private delegate void SetListBoxCallback(string str); private SetListBoxCallback

45、 setListBoxCallback; private delegate void SetRichTextBoxCallback(string str); private SetRichTextBoxCallback setRichTextBoxCallback; private delegate void SetComboBoxCallback(string str); private SetComboBoxCallback setComboBoxCallback; private delegate void RemoveComboBoxItemsCallback(ReadWriteObj

46、ect readWriteObject); private RemoveComboBoxItemsCallback removeComboBoxItemsCallback; /用于线程同步,初始状态设为非终止状态,使用手动重置方式 private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset); public FormServer() InitializeComponent();/构造函数,初始化时会执行其中的代码 listBoxStatus.HorizontalScrollbar

47、 = true; setListBoxCallback = new SetListBoxCallback(SetListBox); setRichTextBoxCallback = new SetRichTextBoxCallback(SetReceiveText); setComboBoxCallback = new SetComboBoxCallback(SetComboBox); removeComboBoxItemsCallback = new RemoveComboBoxItemsCallback(RemoveComboBoxItems); private void buttonSt

48、art_Click(object sender, EventArgs e) /由于服务器要为多个客户服务,所以需要创建一个线程监听客户端连接请求 ThreadStart ts = new ThreadStart(AcceptConnect);/创建连接 Thread myThread = new Thread(ts);创建线程 myThread.Start();/启动线程 buttonStart.Enabled = false; buttonStop.Enabled = true; private void AcceptConnect() /获取本机所有IP地址 IPAddress ip =

49、Dns.GetHostAddresses(Dns.GetHostName(); listener = new TcpListener(ip0, 51888); /创建TcpListener实例 listener.Start();/启动侦听 while (isExit = false) try /将事件的状态设为非终止 allDone.Reset(); /引用在异步操作完成时调用的回调方法 AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback); listBoxStatus.Invoke(setListBoxCall

50、back, 开始等待客户连接); /开始一个异步操作接受传入的连接尝试 listener.BeginAcceptTcpClient(callback, listener); /阻塞当前线程,直到收到客户连接信号 allDone.WaitOne(); catch (Exception err) listBoxStatus.Invoke(setListBoxCallback, err.Message); break; /ar是IAsyncResult类型的接口,表示异步操作的状态 /是由listener.BeginAcceptTcpClient(callback, listener)传递过来的 p

51、rivate void AcceptTcpClientCallback(IAsyncResult ar) try /将事件状态设为终止状态,允许一个或多个等待线程继续 allDone.Set(); TcpListener myListener = (TcpListener)ar.AsyncState; /异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信 TcpClient client = myListener.EndAcceptTcpClient(ar); listBoxStatus.Invoke(setListBoxCallback, 已接受客户连接: + client

52、.Client.RemoteEndPoint); comboBox1.Invoke(setComboBoxCallback, client.Client.RemoteEndPoint.ToString(); ReadWriteObject readWriteObject = new ReadWriteObject(client); clientList.Add(readWriteObject); SendString(readWriteObject, 服务器已经接受连接,请通话!); readWriteOStream.BeginRead(readWriteObject.readBytes, 0

53、, readWriteObject.readBytes.Length, ReadCallback, readWriteObject); catch (Exception err) listBoxStatus.Invoke(setListBoxCallback, err.Message); return; private void ReadCallback(IAsyncResult ar) try ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState; int count = readWriteOStream.EndRe

54、ad(ar); richTextBoxReceive.Invoke(setRichTextBoxCallback, string.Format(来自01, readWriteObject.client.Client.RemoteEndPoint, System.Text.Encoding.UTF8.GetString(readWriteObject.readBytes, 0, count); if (isExit = false) readWriteObject.InitReadArray(); readWriteOStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject); catch (Exception err) listBoxStatus.Invoke(setListBoxCallback, err.Message); private void SendString(ReadWriteObject readWriteObject, string str) try readWriteObject.writeBytes = Syste

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!