联网基于流的套接字和数据文报

上传人:小** 文档编号:71762493 上传时间:2019-01-21 格式:PPT 页数:145 大小:751KB
返回 下载 相关 举报
联网基于流的套接字和数据文报_第1页
第1页 / 共145页
联网基于流的套接字和数据文报_第2页
第2页 / 共145页
联网基于流的套接字和数据文报_第3页
第3页 / 共145页
联网基于流的套接字和数据文报_第4页
第4页 / 共145页
联网基于流的套接字和数据文报_第5页
第5页 / 共145页
点击查看更多>>
资源描述

《联网基于流的套接字和数据文报》由会员分享,可在线阅读,更多相关《联网基于流的套接字和数据文报(145页珍藏版)》请在金锄头文库上搜索。

1、第二十三章 联网:基于流的套接字和数据文报,本章的学习内容包括四个方面: 1 会使用套接字和数据文报实现 Visual C+ .NET 联网应用程序 2 理解如何实现相互通信的 Visual C+ .NET 客户机和服务器 3 理解如何实现基于网络的合作式应用程序 4 学习编写多线程服务器软件,23.1 概述 Internet 紧密联系 “信息世界”;万维网则使 Internet 更容易使 用,并在它的基础上添加了多媒体支持。这使得许多企业都将 Internet 和万维网视为自己的信息系统策略的关键性组成部分。 .NET Framework 内建了丰富的联网功能,它们简化了基于 Interne

2、t 和万维网的应用程序的开发。Visual C+ 不仅通过多线程处理实 现了并发性,还允许程序在万维网上搜索信息,并和远程计算 机上运行的程序合作。 在上一章中,我们讨论了 Web 服务,它是一种高级的联网技 术,允许程序员用 Visual C+ .NET 来开发分布式应用程序。,本章的重点在于为 Visual C+ .NET 的 Web 服务功能提供支持 的联网技术,可利用这些技术来构建分布式应用程序。 在讨论联网技术时,应同时关注 “客户机/服务器” 关系的两个 方面。客户机请求服务器采取某个行动;服务器则采取行动并 响应客户机。这种 “请求 响应” 模型的最常见的一种实现就是 Web 浏

3、览器和 Web 服务器之间的关系。用户通过 Web 浏览器 (客户端应用程序)选择一个要访问的网站时,Web 浏览器就 向目标 Web 服务器(服务器应用程序)发出一个请求。 Web 服 务器通常发送相应的网页来响应用户的请求。 .NET Framework 的联网功能是几个命域空间中提供的。基本联 网功能由命域空间 System:Net:Sockets 中的类和接口来实现的。,Visual C+ .NET 通过该命域空间提供了基于套接字的通信功能, 它允许开发者将联网操作视为文件 I/O 操作。换言之,程序可从 一个套接字(网络连接)中读取数据,也可以将数据写入套接 字,整个过程就像读写文件

4、那样。 System:Net:Sockets 命名空间的类和接口还支持 “基于数据包 的通信”,它允许传输单独的数据包。一批数据要通过网络发送 时,首先会被分解成 “数据包”,也就是一种小的数据单元。每 个数据包含有原始数据的少量字节。此外,数据包中还包含另 一些信息(称为 “标头” 信息),比如数据包的起源地和目的地。 数据包是 Internet 传送声音和视频信息的一种常见的方式。本章 要讲解如何创建和操纵套接字,以及如何通过数据包进行通信。,Visual C+ .NET 中,基于套接字的通信使用的是 “流套接字” (Stream Socket)。使用流套接字,一个进程可以和另外一个进 程

5、建立 “连接”。连接建立后,数据就以连续的 “流” 的形式在进 程之间传输。所以,我们认为流套接字提供的是 “面向连接的服 务”。流行的 TCP(传输控制协议)简化了流套接字通信。 Visual C+ .NET 中,基于数据包的通信采用的是 “数据文报套 接字”(Datagram Socket)。通过它传输的是单独的数据包。和 TCP 不同,为数据文报套接字提供支持的 UDP(用户数据文报 协议)是一种 “无连接的服务”,它不能保证数据包按特定顺序 到达目的地。实际上,传输时还有可能丢失和重复数据包。使 用 UDP 的应用程序通常需要进行额外的编程来解决这些问题。,适合使用 UDP 的是不需要

6、像 TCP 那样的错误检查机制和可靠性 检查机制的应用程序。例如,许多网络游戏使用的就是 UDP, 因为在这些类型的应用程序中,速度是最重要的。对于大多数 Visual C+.NET 程序员,流套接字和 TCP 协议应该是首选的通信 方法(可以实现采用不同处理器和操作系统的计算机能相互通 信)。与面向连接的服务相比,无连接服务的数据通讯性能较 好,但可靠性较差。,23.2 建立简单服务器(使用流套接字) 使用 TCP 和流套接字时,服务器通常 “等待” 客户端的连接请 求。服务器程序一般包括一个用于查询连接请求的控制语句或 代码块,它连续执行,直到服务器收到请求。收到请求后,服 务器建立和客户

7、端的连接,并通过该连接处理客户端的后续请 求,并向客户端发送或从客户端接收数据。 使用 TCP 和流套接字建立一个简单服务器需要 5 个步骤。 第一步:创建 TcpListener 类(位于 System:Net:Sockets 命名空间 中)对象,它代表了一个 TCP 流套接字,服务器通过它来侦听 请求。调用 TcpListener 类的构造函数时:,TcpListener server = new TcpListener ( new IPAddress ( static_cast( 0 ) ), port ) 会将服务器绑定到指定的端口号。端口号是一个数值 ID 编号, 它用于在一个给定的

8、 “网络地址”(也称为 “IP 地址”)标识一个 进程。IP 地址用于在 Internet 上标识一台计算机。事实上,像 这样的网络名称就是 IP 地址的别名。执行联网操 作的每个进程都用一对 “IP 地址/端口号” 来标识自己。所以,给 定的 IP 地址,不能有两个进程使用相同的端口号。通常不需要 显式地(使用 Socket 类的 Bind 方法)将套接字绑定到一个端 口,因为 TcpListener 类和以后讨论的其他类都能自动为你执行 这个绑定以及套接字初始化操作。,端口号范围在 0 65535 之间。很多操作系统为系统服务(比如 电子邮件和 Web 服务器)保留了 1024 以下的端

9、口号。应用程序 在得到特别授权时才能使用这些保留端口号。服务器端应用程 序一般不要把 1024 以下的端口号指定为连接端口,因为操作系 统可能要保留它们。 第二步:调用 TcpListener 的 Start 方法,导致 TcpListener 对象开 始侦听连接请求。 第三步:收到连接请求后,服务器就建立与客户端的连接。 用 System:Net:Sockets:Socket 类对象负责管理与客户端的连接。用 TcpListener 的 AcceptSocket 方法等待连接请求,收到请求后就建 立连接,并在连接成功后返回一个 Socket 对象,代码如下:,Socket connectio

10、n = server-AcceptSocket(); 该语句的操作是服务器收到请求后,AcceptSocket 方法会调用 TcpListener 的底层 Socket 对象的 Accept 方法来实现连接的建立。 这是 Visual C+ .NET 在程序员面前隐藏联网细节的一个典型例子。 程序员只要在服务器程序中使用上述语句,让定义在命名空间 System:Net:Sockets 中的类来处理 “接收请求” 和 “建立连接” 的全 部细节。 第四步:通信处理阶段。只有在服务器和客户端连接后,才能 使用 Socket 类的 Receive 和 Send 方法进行服务器和客户端之间 的通信。如

11、果使用 UDP 和数据文报套接字 Socket 的 SendTo 和 ReceiveFrom 方法,可以在不建立连接的情况下进行数据通讯。,第五步:连接终止阶段。服务器使用 Socket 对象的 Close 方法关 闭连接,导致客户端和服务器之间结束通信。然后大多数服务 器都会回到第三步(等待另一个客户端的连接请求)。 上述服务器方案存在一个重大问题:第四步处理客户端请求 时,会 “阻塞” 其他请求。在通信处理阶段的代码执行时,其他 客户端不能连接服务器。解决该问题最常见的技术是使用多线 程服务器,它将通信处理阶段的代码放到一个单独的线程中。 服务器收到连接请求后,会创建一个 Thread(线

12、程)类对象来 处理该连接,使 TcpListener 能继续接收其他连接请求。这个新 建的线程还会被指派一个新的 Socket(使用不同的端口号)对 象,并通过这个新的 Socket 对象与客户端通信。,流行的 UNIX 和 Windows 网络服务器正是采用了这种多线程服务 器构架。可以让多线程服务器创建一个线程,通过 AcceptSocket 方法返回的 Socket 对象指针来管理网络 I/O。在内存充足的高性 能服务器上,可在多线程服务器中创建线程池(Thread pool), 以便迅速分配这些线程,让它们管理通过每一个 Socket 进行的 网络 I/O。这样一来,收到连接请求后,服

13、务器就不会产生创建 线程的开销。,23.3 建立简单客户机(使用流套接字) 创建一个简单的 “流套接字” 客户端,需要 4 个步骤。 第一步:创建 TcpClient(位于 System:Net:Sockets 命名空间中) 类对象来连接服务器。连接是通过 TcpClient 类的 Connect 方法来 建立的。该方法的一个重载版本可接收两个参数,也就是服务 器 IP 地址和端口号,调用代码如下所示: TcpClient client = new TcpClient(); client-Connect( serverAddress, serverPort ); 其中, serverPort,

14、是一个 int 值,代表服务器的端口号; serverAddress 既可以是一个 IPAddress 实例(其中封装了服务器 IP 地址),也可以是一个指定了服务器主机名的字符串。,另外,程序员可以向 Connect 方法的一个不同的重载版本传递指 向 IPEndPoint 类的一个对象的指针,该对象代表的是一对 “IP 地 址/端口”。TcpClient 类的 Connect 方法会调用 Socket 类的 Connect 方法来建立连接。如果连接成功,TcpClient:Connect 方法会返回 一个正整数;否则返回 0。 第二步:调用 TcpClient 类的 GetStream 方

15、法获得 NetworkStream 对象,以便向服务器写入和从服务器读取数据。 NetworkStream 的 WriteByte 和 Write 方法分别向服务器输出单个字节和字节集。 类似地,可用 NetworkStream 的 ReadByte 和 Read 方法分别从服 务器读取单个字节和字节集。,第三步:通信处理阶段。在该阶段,客户端使用 NetworkStream 的 ReadByte、Read、WriteByte 和 Write 方法来执行客户端和服务 器之间相应的通信操作。在处理一个连接的通信时,客户端可 与服务器类似地通过不同的线程来防止出现阻塞与其他服务器 的通信。 第四步

16、:通信处理完毕后,客户端调用 NetworkStream 的 Close 方法来关闭连接。这会关闭底层 Socket(如果 NetworkStream 有 一个对该 Socket 的引用)。然后,客户端调用 TcpClient 类的 Close 方法来终止 TCP 连接。如果结束通信后不关闭流套接字, 就会浪费资源。注意,切记使用 Socket 的 Close 方法显式关闭 每个使用完毕的套接字。,23.4 通过流套接字连接进行客户机/服务器交互 本节的实例使用前两节讨论的类和技术来构建一个简单的客 户机/服务器应用程序。在此例中,服务器等待客户端的连接请 求。客户端应用程序连接上服务器之后,服务器应用程序向客 户端发送一个字节数组,表示连接成功。然后,客户端显示一 条消息通知用户连接成功。 本例中包括服务器应用程序 Server 和客户端应用程序 Client。 两个应用程序的 GUI 中都包含了用于通信的文本框,用户可在 其中输入消息并将其发送给另一个应用程序。客户端或服务器 发送 “TE

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号