服务器通知客户端其已初始化的最佳方式
本文关键字:最佳 方式 初始化 通知 客户端 服务器 | 更新日期: 2023-09-27 18:27:05
编辑2重命名问题
我有一些Java代码(客户端),它启动了一个用C#(服务器)编写的独立进程。向C#进程传递一对套接字(一个到打开的listen
,一个到reply
);当它在listen
套接字上接收到连接时,它处理发送的数据并回复reply
套接字上的相同IP。该进程被设计为连续运行,监听连接并回复。由于它总是回复同一个IP,它当然可以接受来自许多不同客户端的消息。Java代码反过来监听进程的响应。
虽然这是一个相当基本的系统,但除了一个问题外,设置工作得很完美。Java代码在发送消息之前使用Process.waitFor()
和Process.exitValue()
等方法来确定进程是否正在运行。我遇到的问题是,流程在启动后的几秒钟内还没有准备好实际接收消息。
我的问题是服务器告诉客户端它已经启动的最佳模式是什么我想到的选项包括:
- Java进程反复尝试连接并发送测试消息,只有在收到响应时才会停止
- C#进程在启动时向客户端IP列表广播
- Java只需等待几秒钟,然后尝试连接
我并不特别喜欢上面的任何一个选项,尽管我倾向于选项1)。这里有什么既定的模式可以使用吗?
请注意,我不想使用任何现有的框架进行此交流。实际上,消息非常简单,两端的消息代码"手动"编码和解码为字节流——为了节省一百多行代码,我不想改变这一点。
我意识到这种"最佳方式"的问题可能会因为没有建设性而被关闭,但我在谷歌上搜索了几个小时,一无所获。任何帮助或建议都将不胜感激:)
编辑-更多上下文
尽管大多数客户端/服务器关系都涉及服务器在任何客户端尝试连接之前很久就启动(从而完全避免了这个问题),但这里的设置略有不同。
在这种情况下,客户端可以在需要时有效地启动服务器。此外,如果客户端可以看到服务器进程没有运行,则会启动一个新进程。在这两种情况下,客户端都需要在发送第一条消息
我会让一端充当服务器。在准备好接受新连接之前,该服务器不应该开始侦听新连接,例如,它已经足够初始化。
我会让另一端充当客户。客户端在准备好连接之前不应尝试连接。
这样,两端都不需要告诉另一端它已经初始化,因为在两端都足够初始化之前,它不应该有连接。
这个单套接字连接可以用于以一种方式将消息作为请求发送,以另一种方式作为回复发送。这可以是任意一个方向。
这将如何处理试图连接到同一服务器的多个客户端?异步通信呢?
服务器可以有任意数量的连接。这是常见的做法。
我在某个地方读到,共享一个套接字意味着通信必须是同步的,但我可能错了。
如果您使用的是纯IO或NIO,那么对写/读的调用是同步的。NIO2疯狂地调用异步IO(或模拟它的东西),但额外的复杂性不值得拥有IMHO的任何优势。
如果服务器启动时间是可变的,那么客户端就无法知道在连接之前应该等待更长的时间。
客户不需要知道这些。它可以尝试每N秒连接一次,直到服务器启动。