从用 C# 编写的程序中获取数据到 Java 程序中
Posted
技术标签:
【中文标题】从用 C# 编写的程序中获取数据到 Java 程序中【英文标题】:Getting data from an program written in C# into a Java program 【发布时间】:2013-04-05 16:53:28 【问题描述】:我有一个用 C# 编写的程序,它从第三方服务器接收数据并将其处理成一系列整数(它们正在快速流式传输)。该程序是用 C# 编写的,因为第三方提供了用于处理数据的类,但仅在 C# 中提供它们。我想获取这些整数并在 Java 程序中以流的方式使用它们(因此,一旦它们被 C# 程序流式处理和处理,我想在 Java 程序中使用整数)。第二个程序是用 Java 编写的,因为另一个第三方只用 Java 提供他们的类(这是必需的)。所以我的猜测是要么-
-
寻找在 Java 中运行 C# 类的程序,然后将处理传入数据的 C# 类直接包含到我的 Java 程序中 [这似乎不太有希望 - 我似乎无法获得 jni4net,这是建议在其他帖子中工作]
或
-
用 C# 编写另一个程序,将正在处理的整数保存到特定的内存位置。编译程序。然后从 Java 源代码中运行可执行文件,并在 Java 代码中编写某种回调,当特定内存位置的整数发生更改时,该回调会拾取并记录这些新数字是什么[不知道如何开始! ]
对于最不痛苦的方法,有人有什么建议吗?
【问题讨论】:
看看这个:***.com/questions/14824491/… 为什么需要这样做?是否有某种超出您控制范围的要求迫使您使用 2 种不同的语言,或者这两种应用程序或多或少已经存在? 只需在 java 和 C# 应用程序之间创建一个命名管道。听起来最适合您的情况。在一般情况下,只需查找“进程间通信”即可。程序之间有许多与语言无关的通信方式。 @ConradClark 套接字可能不是最简单的方法,尽管它是一种可能的选择。 Sam - 不幸的是,我对使用这两种语言别无选择,我正在尝试处理需要专门在 Java 和 C# 中编译的类的数据。感谢你们的回复 - 由于我不熟悉 IPC,因此可能需要一些时间来查看您的建议,但一旦找到可行的解决方案,我会报告! 【参考方案1】:听起来你想要某种形式的进程间通信机制。
因此,任何允许交流的东西都可以使用:
-
命名管道
套接字
TCP 连接
共享内存
在这些选项中,我建议使用命名管道,因为它们最容易掌握,并且没有端口不可用等问题。
见:How to open a Windows named pipe from Java?
还有:Using Named Pipes for IPC in C#
这篇文章:Using Named Pipes to communicate between C# and Java 描述了在两种环境中使用管道的端到端方式。
【讨论】:
【参考方案2】:您可以将 Java 和 C# 程序合并为一个,并使用 JNI 来桥接 C#/Java 接口。 JNI 基本上允许您从 Java 调用 C# 方法,反之亦然。我想这将同样难以编码为套接字,而且会有一些加速。
更多信息在这里:http://www.codeproject.com/Articles/245622/Using-the-Java-Native-Interface-in-Csharp
【讨论】:
这不仅比其他一些方法更难,而且我认为这不是好的设计。这里我们有两个逻辑上独立的程序需要通信。与其让它们彼此了解并以这种方式将它们紧密耦合在一起,它们可以通过某种 IPC 方法通过操作系统进行通信,从而减少耦合。【参考方案3】:过去,为了将 Java 系统中的数据导入 Excel(通过 RTD API),我不得不做类似的事情,最后我选择了套接字协议方法。
如果您有一个非常简单的数据集(例如您上面提到的整数流),这应该非常简单 - 只需查看 Java Socket 和 ServerSocket 类的文档,以及相应的 C# Socket 类。
如果您最终得到一个更复杂的 API,包含多条消息等,您可能想看看 Google 协议缓冲区,因为周围有 .Net 和 Java 实现。
【讨论】:
以上是关于从用 C# 编写的程序中获取数据到 Java 程序中的主要内容,如果未能解决你的问题,请参考以下文章
如何从用 Swift 编写的 Flutter 平台特定代码启动 ViewController?
如何从用 MFC (MSVC 2008) 编写的应用程序查询基于 CGI 的网络服务器并处理结果?