1

多个客户端程序与单个服务器程序进行通信的最佳方式是什么,所有这些程序都在单个 Windows 计算机上运行?全部用VB6编写。我很感激你如何解决这个问题的建议。

注意:我们正在努力过渡到 .NET,但必须在 .NET 准备好之前向 V6B 版本添加一项功能。

可能性包括 TPC 连接、命名管道、共享内存、消息、文件等。

客户端向服务器传递一个字符串作为输入,服务器将其与只有服务器知道的数据结合起来,生成另一个字符串返回给客户端。两个字符串都只有大约 100 个字符长。仅在需要打开新文件时才联系服务器,因此通信量非常低……可能在 15 秒内一连串 10 次呼叫,然后是一个小时的空闲时间。

但是有可能两个客户会选择大约在同一时间请求信息。阻塞/锁定当然是可以接受的,因为服务器将在不到一秒的时间内完成每个请求,并且几秒钟的延迟对任何程序都不重要。

服务器的算法很复杂,由于对应用程序很重要的几个原因,不应在每个帮助程序中复制。这就是需要服务器的原因。

背景:
我正在为现有的大型遗留程序添加功能。这个单一程序有几个其他遗留程序,它们充当帮助程序,并在用户做出某些选择时运行。这些程序以 shell 命令启动,而不仅仅是单独的线程。例如,一位助手将新数据从 DVD 驱动器加载到硬盘驱动器上。另一个助手只是显示行星当前位置的图表。

这是一个大型商业遗留程序,恰好是用 VB6 编写的。我们正在努力将它和所有帮助程序转换为 .NET,但必须首先在 vb6 下发布具有此附加功能的新版本。(请不要告诉我不要使用 VB6,因为我们已经搬到别处了。)我们需要一个临时的 VB6 解决方案。

4

2 回答 2

5

VB6 通过 Pro 和 Enterprise Edition 中包含的标准 Winsock Control 组件非常好地处理 TCP 和 UDP。不过,许多 shadetree 编码人员似乎确实在努力解决它。这可能是最明显的路线,因为 VB6 中唯一的其他本地 IPC 将是 COM/DCOM 和 DDE,但是 MSMQ 也为 VB6 提供了出色的支持。

基于 IP 的协议的缺点是它们有限的命名空间和导致冲突的高概率(64K 端口号,许多留给标准应用程序,临时端口范围等)。它们也有点“重量级”,但考虑到即使是仍在使用的最古老的 PC 的大量资源以及您的轻流量需求,您在决定时也可以忽略这一点。

您考虑的另一个选项是命名管道。

这在您的情况下提供了许多优势。一方面,命名空间要大得多,只需要一个唯一的名称,在 Win9x 之后的时代,它可以长达 256 个字符,这使得唯一性相当容易实现。另一方面,只要您的防火墙允许“文件和打印共享”,您就可以在这方面做好准备。

此外,对于您的应用程序,您似乎只需要 RPC 风格的机制,而不是任意的双向流或消息。 TransactNamedPipe()致电您的客户可能是理想的选择。命名管道在 LAN 上工作,但在一台 PC 中,它们非常快速且重量轻。

虽然 VB6 不附带命名管道组件,但只要不需要极高的性能,这样的东西就很容易创建。您可以在服务器中使用基于定时器的轮询,而不是尝试实现重叠 I/O 来获得异步性。几年前我把一个放在一起,用这种方法很幸运。

不久前,我在PipeRPC-RPC Over Named Pipes上发布了一个相当稳定的版本。那里有一个较旧和较新的版本,其中包含使用示例和文档。按照设计,客户端进行“调用”,传递请求参数的字节数组并接收响应结果的字节数组。您也可以在不做任何更改的情况下推送 Unicode 字符串,让编译器强制转换类型。

对于客户端和服务器,只需一个“插入式”UserControl。

回过头来看这个问题:

服务器的算法很复杂,由于对应用程序很重要的几个原因,不应在每个帮助程序中复制。这就是需要服务器的原因。

如果这真的是问题所在,为什么不创建一个所有程序都使用的共享 DLL?

于 2012-09-16T01:14:14.717 回答
2

对于迁移到更新平台的现有 VB6 应用程序的一次性升级版本,我会强调保持修改尽可能简单和直接。因此,我不会走任何涉及共享内存或任何相对不寻常的事情的路线。

一些选项,没有一个非常简单,但至少有一些想法:

  • 在执行转换的服务器代码中公开一个 COM 对象,并且可以由客户端应用程序使用。客户端将来自服务器的对象实例化为进程外对象,并让 COM 处理所有编组等。

  • 服务器是否有任何网络意识?VB6 本身并不能很好地执行套接字/tcp,但如果您有理由添加它,您也许可以利用它来执行基于套接字的连接和数据交换。

  • 服务器和客户端可以各自轮询一个公共资源文件夹,以查找构成您描述的翻译服务的入站/出站请求的特定文件的存在。不是很优雅,但它可能是最简单的。

只是一些想法,让你思考一些事情。希望这在某种程度上有所帮助。祝你好运!

于 2012-09-15T13:06:49.123 回答