Windows、VB6 上的多客户端进程间通信

Mar*_*k T 1 windows vb6 ipc

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

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

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

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

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

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

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

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

Bob*_*b77 5

VB6 通过专业版和企业版中包含的标准 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 上发布了一个相当稳定的版本。那里有一个较旧和较新的版本,其中包含使用示例和文档。按照设计,客户端进行“调用”,传递请求参数的 Byte 数组并接收响应结果的 Byte 数组。您也可以在不做任何更改的情况下推送 Unicode 字符串,让编译器强制执行类型。

客户端和服务器都只需一个“插入”用户控件。

回顾这个问题:

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

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