65.9K
CodeProject 正在变化。 阅读更多。
Home

使用免费 SocketPro 包创建超级客户端和服务器应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.48/5 (16投票s)

2002年1月3日

11分钟阅读

viewsIcon

194608

downloadIcon

6327

一组用于编写互联网分布式计算应用程序的套接字库

引言

目前,大多数人使用 MS DCOM/COM+、Java Bean/RMI 和 Corba 进行互联网分布式计算。所有这些技术都提供了一些工具和中间对象来简化互联网开发。然而,这些技术有一个共同的根本问题,即客户端和服务器之间的所有调用都会被阻塞以等待返回结果(如果我说错了请纠正我)。客户端保持静止,发送请求到服务器后必须等待一段时间。如果请求是一个耗时的操作,客户端应用程序对用户来说似乎已无响应。在大多数情况下,我们可以在客户端使用工作线程进行后台计算来解决这个问题。然而,这代价高昂,需要更多的编码、数据同步和混乱的代码逻辑。此外,我也怀疑这些技术能否真正有效地跨互联网传输数据。

最近,我有时间创建了一个名为 SocketPro 的基于套接字(socket)的框架包,用于编写互联网分布式计算应用程序,其中包含一组 COM DLL 和一个标准 DLL(NetBaseR.dll),以便于开发客户端和服务器应用程序。在不久的将来,所有 DLL 的文档和其他帮助文章将在 UDAParts 站点上提供。

所有从此框架开发的应用程序都将具有以下重大优势,以及其他众多优势:

  • 非阻塞/阻塞、并行计算的客户端和服务器。

    关于客户端开发,这个优势意味着客户端能够通过一个或多个套接字同时向服务器发送多个请求,以实现非阻塞和并行计算。客户端 GUI 组件永远不会被阻塞,无需创建工作线程。关键点在于,您可以实现非阻塞计算而不涉及线程。所有导致数据在互联网上传输的客户端函数调用,在创建套接字后,都可以根据您的意愿在阻塞和非阻塞模式之间切换。这是另一个特殊的优势。从其他技术,如 MS DCOM/COM+、Java Bean/RMI 和 Corba 中很难获得此功能。
    关于服务器端开发,这个优势意味着服务器应用程序能够快速并行处理来自一个或不同客户端机的多个请求,无论请求是耗时的操作还是短促的操作。服务器是使用多线程和消息队列开发的。所有队列都独立运行,并行处理。在某些情况下,服务器可以开发成能够先处理并返回一个快速请求,即使该请求是在一个耗时操作的请求之后发送到服务器的。服务器应用程序将各种调用分组/集群,并将它们分配到不同的队列进行处理。在所有情况下,来自一个或不同套接字的所有短促请求都仅分配到一个队列,以减少涉及的线程和队列。服务器还能够自动终止所有空闲队列和线程,以减少所需的系统资源和线程上下文切换。服务器能够通过 ping 函数检测死机客户端。

    您可能会认为实现起来一定很难。确实,我花了很长时间才创建了这部分软件组件。您可能会认为基于这个框架开发服务器和客户端应用程序很困难,因为涉及消息队列、多线程、数据同步问题。您错了,大错特错!!实际上,该框架封装了 Winsock 2 库,并为您自动高效地管理消息队列、线程和数据同步。您只需要实现您的函数,并告诉框架该函数是否是耗时操作。仅此而已!本文附带的还有三个 Visual C++ 示例:DResolver(客户端)、NTSvs(服务器)和 NormalApp(服务器),展示了如何使用 SocketPro 包编写客户端和服务器应用程序。您将看到使用 SocketPro 包编写如此酷的客户端和服务器应用程序有多么简单。

  • 由于 Nagle 算法,客户端和服务器都以最快的速度运行。

    最初,我说过我怀疑 MS DCOM/COM+、Java Bean/RMI 和 Corba 能否有效地跨网络传输数据。让我用一个典型的例子来解释一下原因。在以太网网络中,TCP/IP 的 MTU 是 1460 字节。假设一个客户端套接字发送 29 个请求,每个请求 50 字节,并收到 29 个 50 字节的返回数据。如果您使用 MS DCOM,数据往返次数将肯定是 29 次。但是,如果您的服务器和客户端应用程序以非阻塞模式运行,Nagle 算法将默认生效。套接字栈将自动将所有 29 个请求合并成一个大数据流,并发送到服务器。如果所有 29 个操作都不是耗时的操作,服务器同样进行合并,并将所有处理结果以一个大数据流的形式发送回客户端。数据往返次数只有一次!据我所知,即使 Nagle 算法已开启,MS DCOM/COM+、Java Bean/RMI 和 Corba 也几乎无法利用 Nagle 算法进行合并(如果我说错了请纠正我),因为它们的函数内部无法实现非阻塞。我很难想象这些技术能够通用地自动将所有函数调用打包成一个,然后在服务器端解包成单独的调用。

    即使您的客户端套接字应用程序不运行在非阻塞模式下,您也可以通过代码将调用打包成一个。但这并不友好。使用 DCOM/COM+、Java Bean/RMI 和 Corba 无法打包函数调用。
    Nagle 算法对于服务器应用程序尤其重要。减少数据往返是提高服务器和客户端应用程序性能最有效的方法,尤其是在许多客户端连接到服务器应用程序、数据在网络上传输量大或您的网络速度慢如拨号网络的情况下。
    此外,SocketPro 直接与 Winsock 2 通信,没有中间层。与具有相同协议和硬件的 MS DCOM 相比,根据我的实验,即使 SocketPro 在跨机器的阻塞模式下运行,其速度仍然快 130%。为了向您展示此 SocketPro 包的性能,我编写了一个名为 SpeedTest 的示例,并将其结果与 DCOM 应用程序(DCOMSleep 和 ClientTest)进行了比较。所有示例源代码都包含在此包中供您测试。查看代码并玩转示例。和我一样,我认为您在获得性能数据后会充满各种感受!这是我在我的机器上获得的性能结果。

    硬件:客户端 -- P133,48MB RAM;服务器 -- P700,256MB RAM;快速以太网 10/100 网卡 + 以太网 5口集线器(10Mbps)+ 两根 Category 5 100BaseTX 网线(总计 50 美元,LinkSys NC100)。
    软件:客户端 -- Win95;服务器 -- NT 4.0 Server。

    表 1. 不同方法在 1000 次调用平均值下的速度比较。

      异步/批量 异步/Nagle 同步/逐一 DCOM
    速度自动检测(100 Mb/10Mb 全双工) 7-45 4-7 2.3 1(2.5 ms/调用)
    10Mb 全双工 9-52 28-60 1 1(25.5 ms/调用)

    在我的所有测试和条件下,SocketPro 应用程序的速度始终比 DCOM 快。我希望这些测试数据对您有吸引力。运行示例后,如果您发现您的结果与这些结果不符,请在此处或私下给我留言。在某些情况下,如果只向服务器发送一个请求,这些方法之间的速度变化不大。但是,如果将两个或更多异步调用一起调用,通过减少网络上的数据帧,批量处理或 Nagle 算法的性能将得到提升。

  • 跨平台数据通信和跨语言开发。

    DCOM/COM 仅限于 Windows 平台,尽管微软表示 DCOM 框架可用于其他平台。很难找到在其他平台上开发的真正 DCOM 应用程序。您可以使用任何平台的多种语言(Java、C/C++、VB、.net 等)来开发客户端套接字应用程序,以与 SocketPro 服务器应用程序通信,因为套接字通信基于二进制数据,依赖性非常低。至于 SocketPro 的服务器应用程序,目前您只能使用 C++ 在 Win 9x、NT4.0 ME、2k 和 XP 平台上进行开发以获得最佳性能。

其他优点包括:

  • 快速连接到服务器。
  • 快速初始化类对象。
  • 简单的安装和安全设置。
  • 轻松创建服务器应用程序特定的身份验证机制。
  • 易于学习和使用,没有复杂的概念。

一个缺点是,开发人员必须准备好在客户端和服务器两端处理阻塞和非阻塞调用。这涉及到更多的编码来打包和解包发送和接收的数据。概念简单易懂,但繁琐且代码量大。为了获得最佳性能并减少数据往返,而不依赖 Nagle 算法,开发人员应尽力自己打包数据,而不是依赖 Nagle 算法,因为 Nagle 算法仍然会消耗一些时间,如果机器不够快的话。为了减少打包代码,包中提供了一个帮助类 CPacking。有关如何使用它的信息,请参见下面的 VC++ 示例代码。

测试服务器和客户端应用程序的设置

下载 socketpro.zip 后,将其解压缩到一个目录。您需要设置位于 ..\netdemo\clientcomponents\ 和 ..\netdemo\svrcomponents\ 目录中的客户端和服务器应用程序。

要启动示例服务器应用程序,您可以双击应用程序 MultipleSvs.exe(端口号=1741)。如果您的服务器是 NT 或其后续版本,您也可以启动一个 NT 服务,MultiSvs.exe(端口号=1739)。要启动 NT 服务,您应该通过执行 DOS 命令 MultiSvs -Service 来安装它。安装后,您可以从 NT 平台通过 -> 设置 -> 控制面板 -> 服务 -> MultiSvs 来启动它。如果您使用的平台不是 NT,您可以按照类似的步骤启动。

要在 Win32(非 CE)平台上运行示例客户端应用程序,您需要首先在客户端计算机上注册四个 COM DLL(ClientSocket.dll、SockFile.dll、SBroker.dll 和 DResolver.dll),它们位于 ..\netdemo\clientcomponents\ 目录中。要测试示例 NT 服务器应用程序的性能,您可以在一台客户端计算机或多台客户端计算机上运行多个应用程序。此外,还提供了示例 VB 客户端应用程序和代码。请查看 ..\netdemo\samples\ 目录中的文件。我希望您喜欢这个应用程序,并给我您的 bug 报告、问题、建议和疑虑。

演示客户端和服务器应用程序的功能

以下是演示服务器应用程序可用的功能列表:

  • 在服务器和客户端之间交换文件。
  • 远程访问服务器中的文件。
  • 代表客户端提供套接字代理/经纪人服务,以处理与其它服务器的各种命令。
  • 提供主机名解析服务。

以下是客户端组件可用的功能列表:

  • ClientSocket.dll:您可以将其用于在 Win 32 平台上与 SocketPro 服务器应用程序建立连接,以及与所有运行在所有平台上的基于套接字(socket)的应用程序建立连接。建立连接后,您可以使用它来同步或异步地执行各种命令。此外,它还提供在客户端进行 DNS 解析的功能,可以是同步的或异步的。您可以独立使用它,无需其他组件。
  • SockFile.dll:您可以将其用于在服务器和客户端之间快速交换文件。您还可以通过 SocketPro 服务器应用程序使用它来远程访问服务器机器中的文件。它拥有 Win32 文件 I/O 函数的所有重要功能。
  • SBroker.dll:您可以使用它通过演示服务器应用程序执行所有协议命令。
  • DResolver.dll:您可以使用它通过演示 SocketPro 服务器应用程序进行 DNS 解析。

以下是演示客户端和服务器应用程序的特点:

  • 您可以通过测试附带的示例看到这些特点。这些特点包括速度、无需工作线程的并行/非阻塞计算,以及简单性,以及许多其他方面。

源代码

在此包中,您可以获得所有四个 VB 客户端应用程序的源代码。对于 VC++ 代码,您将获得两个客户端应用程序(SpeedTest 和 DResolver)和两个服务器应用程序(NTSvs 和 MultipleSvs)的源代码。

注释

本包中包含的所有应用程序均为免费,但有以下限制:

  • NetBaseR.dll 允许您从一个客户端应用程序仅构建两个到服务器的客户端套接字连接。SocketPro 服务器应用程序仅支持接受 32 个客户端连接。
  • ClientSocket.dll 文件硬编码为仅支持一个客户端应用程序的 2 个套接字连接。
  • 客户端 COM DLL,SBroker.dl 和 DResolver.dll,对您完全免费。
  • 客户端 COM DLL SockFile.dll 对您免费,但有四种功能:ISocketFile::GetFile、ISocketFile::SendFile、ISocketFile::WriteText 和 ISocketFile::WriteChunk,将在 60 天后禁用。
  • 服务器应用程序 MultipleSvs.exe 和 MultiSvs.exe 的身份验证已禁用,以便您轻松设置和测试。您应该足够重视安全问题。否则,有人可能会访问您的服务器机器文件并通过服务器应用程序进行管理。

如果您需要我们为您做些什么,请通过电子邮件 yekerui@yahoo.com 给我们留言。服务现已提供!

© . All rights reserved.