C#\ Java和Java \ C#对客户端\服务器 - 客户端(套接字)关闭时正常断开连接

时间:2013-01-16 12:53:17

标签: c# java tcp client-server

这可能更像是讨论而不是问题。

背景:
我有两对服务器/客户端,一对用Java编写,另一对用C#编写。两对都在做同样的事情。使用Java \ Java和C#\ C#组合时没问题。我想组合Java \ C#和C#\ Java工作。 I \ O没问题,我使用表示XML格式字符串的字节数组。我一定会使用TCP。

我需要关心优雅的断开连接,在Java中没有这样的东西。当您关闭客户端的套接字时,服务器端套接字仍处于被动关闭状态 - 因此处理此套接字的服务器线程仍然存在,并且在许多客户端的情况下,我最终可能会有数千个不必要的线程。在C#中,调用TcpClient.Available以确定缓冲区中是否有数据或客户端是否已关闭(SocketException)就足够了。在Java中我可以想到两种方法:

  1. 你必须在套接字的基础流上写一些内容来真正测试,是否仍然打开了另一面。
  2. 你必须让另一方意识到,在关闭之前你正在关闭连接的一侧。我已经实现了这一个,在关闭客户端套接字之前,我正在向服务器发送包含0x04字节(传输结束)的数据包,服务器通过关闭套接字的服务器端对此字节作出反应。
  3. 不幸的是,当涉及到C#\ Java和Java \ C#对客户端\服务器时,这两种方法都让我陷入了两难境地。如果我希望这些对能够相互通信,我将不得不添加用于将0x04字节发送到C#客户端的代码,当然还有将代码处理到C#服务器,这是一种开销。但我可以忍受不必要的网络流量,主要的问题是,这个C#代码是核心通信库的一部分,除非绝对必要,否则我不想触摸

    问题:
    Java中是否有其他方法可以优雅地断开连接,这不需要写入底层的套接字流并检查结果,所以我不必在C#代码中处理这个问题?对于使用过的库,我有一个自由的手,我不必只使用Java SE \ EE。

2 个答案:

答案 0 :(得分:2)

我已经(我认为是)对这个“优雅的断开连接”主题in this answer进行了简明扼要的解释,我希望你觉得它很有用。

请记住,双方必须使用相同的优雅断开模式。我发现自己试图优雅地断开客户端套接字,但服务器继续发送数据(没有关闭它自己的一面),这导致无限循环......

答案 1 :(得分:0)

答案显而易见。在C#中也没有像优雅的断开连接那样,它与TCP协议契约有关。因此存在与Java相同的问题,只有一点点不同,您可以在某些情况下解决 - >如果你通过NetworkStream发送0字节,然后检查TcpClient.Connected状态,它是以某种方式正确的。然而,根据我在互联网上发现的内容,这对于如何在C#中测试连接既不可靠也不是优先。当然在我的C#库中已经使用过它。在Java中,你根本不能使用它。

所以我的解决方案是在客户端断开连接时向服务器发送“传输结束”数据包是可靠的,我也在C#库中引入了它。现在我只是害怕第一个出现的虫子而颤抖......

最后一点,我还必须实现某种机制,它会在服务器上为崩溃的客户端收集处理线程。如果你做了类似的事情,请记住这一点,没有客户必然会结束;)