1

编辑 2重命名问题

我有一些 Java 代码(客户端),它启动了一个用 C#(服务器)编写的单独进程。C#进程传递一对套接字(一个到listenon,一个reply到);当它接收到listen套接字上的连接时,它会处理发送的数据并回复套接字上的同一 IP reply。该过程旨在连续运行,侦听连接并回复。由于它总是回复同一个 IP,它当然可以接受来自许多不同客户端的消息。Java 代码依次侦听进程的响应。

尽管这是一个非常基本的系统,但除了一个问题外,该设置运行良好。Java 代码在发送消息之前确定进程是否正在运行,使用 和 之类的Process.waitFor()方法Process.exitValue()。我遇到的问题是该进程在启动后的几秒钟内还没有准备好实际接收消息。

我的问题是服务器告诉客户端它已经启动的最佳模式是什么?我想到的选项包括:

  1. Java 进程反复尝试连接并发送测试消息,仅在收到响应时才停止
  2. C# 进程在启动时向客户端 IP 列表广播
  3. Java 只需等待几秒钟,然后尝试连接

尽管我倾向于选项 1),但我并不特别喜欢上述任何选项。这里有什么既定的模式可以使用吗?

请注意,我不想为此通信使用任何现有框架。实际上消息非常简单,两端的消息代码“手动”编码和解码为字节流——为了节省一百多行代码,我不想改变这一点。

我意识到这种类型的“最佳方式”问题可能会因为不具建设性而被关闭,但我已经用谷歌搜索了几个小时,却一无所获。任何帮助或建议将不胜感激:)

编辑 - 更多上下文

尽管大多数客户端/服务器关系都涉及服务器在任何客户端尝试连接之前很久就启动(从而完全避免了这个问题),但这里的设置略有不同。

在这种情况下,客户端在需要时有效地启动服务器。此外,如果客户端可以看到服务器进程没有运行,它会启动一个新进程。在这两种情况下,客户端都需要在发送第一条消息之前知道服务器何时初始化(而不仅仅是进程何时开始)

4

1 回答 1

2

我将一端充当服务器。该服务器不应该开始侦听新连接,直到它准备好接受它们,例如它已经足够初始化。

我会让另一端充当客户。客户端在准备好连接之前不应尝试连接。

这样,任何一端都不需要告诉另一端它已被初始化,因为在两端都被充分初始化之前它不应该有连接。

这个套接字连接可用于以一种方式作为请求发送消息,并以另一种方式作为回复返回。这可以是任一方向。

这将如何处理尝试连接到同一服务器的多个客户端?那么异步通信呢?

服务器可以有任意数量的连接。这是常见的做法。

我在某处读到共享单个套接字意味着通信必须是同步的,但我可能是错的。

如果您使用的是普通 IO 或 NIO,则对写入/读取的调用是同步的。NIO2 使调用异步 IO(或模拟它的东西)发疯,但额外的复杂性不值得您拥有恕我直言的任何优势。

如果服务器启动时间是可变的,则客户端无法知道它应该在连接之前等待更长时间。

客户不需要知道这一点。它可以每隔 N 秒尝试连接一次,直到服务器启动。

于 2013-08-08T15:26:36.707 回答