gpt4 book ai didi

c# - 服务器通知客户端它已初始化的最佳方式

转载 作者:行者123 更新时间:2023-11-30 04:17:02 24 4
gpt4 key购买 nike

编辑 2 重命名的问题

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

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

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

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

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

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

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

编辑 - 更多上下文

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

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

最佳答案

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

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

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

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

How would this handle multiple clients trying to connect to the same server? And what about asynchronous communication?

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

I read somewhere that sharing a single socket means the communication has to be synchronous, but I could be wrong.

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

If the server startup time is variable there is no way for the client to know that it should wait longer before connecting.

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

关于c# - 服务器通知客户端它已初始化的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com