通过套接字从 Objective-C 向 Java 发送数据

Posted

技术标签:

【中文标题】通过套接字从 Objective-C 向 Java 发送数据【英文标题】:Sending data via a socket from Objective-C to Java 【发布时间】:2009-07-10 15:38:15 【问题描述】:

我有一个 Java 程序(称为 Jack)和一个 Objective-C 程序(称为 Oscar),它们在同一台 Mac OS X 计算机上运行。 Oscar 每秒一次通过套接字向 Jack 发送字符串消息。

为了可靠性和性能,在 Jack 和 Oscar 之间保持一个开放的套接字会更好吗?还是重复打开一个套接字,发送消息,然后再次关闭套接字会更好?

【问题讨论】:

【参考方案1】:

保持打开状态。您将非常需要它(每秒一次),并且打开新套接字会产生一些开销。另外,在垃圾收集器出现之前,您将使用新对象来处理堆。

【讨论】:

【参考方案2】:

保持开放杰克,保持开放。我已经需要一些 CPU 周期来打开和关闭连接,只是为了在下一秒再做一次。

【讨论】:

【参考方案3】:

调用 Java 原生接口会更容易吗?就个人而言,我认为在本地搞乱套接字可能有点矫枉过正,但话又说回来,我不知道你想要完成的整个故事。

【讨论】:

这是评论而非答案。我想下一个问题是如果你出于某种原因使用两台机器而不是一台。 我权衡了使用 JNI 与套接字。 JNI 是讨厌的东西,容易出现混乱的错误。【参考方案4】:

如果您可以忍受丢弃一两个数据包,您可能希望改用 UDP。

每隔一段时间,长期的 TCP 连接会在连接变坏时变得有点奇怪并挂起。通常是恢复,但并非总是如此——同时它们可能会变慢。

在您每次都重新发送所有数据并且不需要每个数据包因为您不关心历史记录的情况下,UDP 可以更好地运行......

保持开放的连接可能对你有用,理论上没问题……我只是运气不好。

【讨论】:

【参考方案5】:

抱歉,我很快就阅读了这个问题。是的,如果它在本地机器上,我会保持套接字打开。打开和关闭每个需要分配的内存是没有意义的。在这种情况下,来回研磨将无济于事。

我的理解是正确的,您正在编写一个侦听连接的 Cocoa 服务器应用程序,以便它可以将一些数据传递给一个无法访问从 Cocoa API 返回的信息的 Java 应用程序?

您确定不能仅从 Java 中的终端命令获取结果吗?我完全是在猜测,但我认为如果是这种情况,您可以改进您的计划。

【讨论】:

这不是真的通过网络。两个进程在本地运行,在同一台机器上。我需要定期获取一些无法通过 Java 获得的 Mac 系统信息。

以上是关于通过套接字从 Objective-C 向 Java 发送数据的主要内容,如果未能解决你的问题,请参考以下文章

通过套接字从 c# 向节点 socket.io 服务器发送数据

iOS 上的 Objective-C 套接字发送和接收

Objective-C 字符串编码问题

我如何通过角度向套接字服务器发送数据和获取数据

从 Objective-C 向 Swift 公开一个常量变量

从Objective-C向Swift转换学习到的经验