这可能更像是一个讨论而不是一个问题。
背景:
我有两对服务器/客户端,一对用 Java 编写,一对用 C# 编写。两对都在做同样的事情。当我使用 Java\Java 和 C#\C# 组合时没有问题。我想让 Java\C# 和 C#\Java 的组合也能正常工作。I\O 没问题,我使用的是表示 XML 格式字符串的字节数组。我一定会使用 TCP。
我需要关心优雅的断开连接,在 Java 中没有这样的事情。当您关闭客户端的套接字时,服务器端套接字仍处于被动关闭状态 - 因此处理此套接字的服务器线程仍然存在,并且在许多客户端的情况下,我最终可能会得到数千个不必要的线程。在 C# 中,调用 TcpClient.Available 来确定缓冲区中是否有数据或客户端是否已关闭(SocketException)就足够了。在Java中,我可以想到两种方法:
- 您必须向套接字的底层流写入一些内容才能真正测试,另一端是否仍然打开。
- 您必须让另一方知道,您正在关闭连接的一侧,然后再关闭它。我已经实现了这个,在关闭客户端套接字之前,我将包含 0x04 字节(传输结束)的数据包发送到服务器,服务器通过关闭套接字的服务器端对此字节做出反应。
不幸的是,当涉及到 C#\Java 和 Java\C# 客户端\服务器对时,这两种方法都让我进退两难。如果我希望这些对能够相互通信,我将不得不添加用于将 0x04 字节发送到 C# 客户端的代码,当然还有将其处理到 C# 服务器的代码,这是一种开销。但是我可以忍受不必要的网络流量,主要问题是,这个 C# 代码是核心通信库的一部分,除非绝对必要,否则我不想碰它
问题:
Java 中是否有其他方法可以优雅地断开连接,不需要写入底层套接字流并检查结果,因此我也不必在 C# 代码中处理这个问题?当涉及到使用的库时,我可以自由支配,我不必只使用 Java SE\EE。