路由器后面的C#客户端与公共互联网上的Java服务器之间的通信

时间:2012-10-29 07:15:53

标签: c# java sockets client-server push

我有一个C#应用程序,它像客户端一样,可以安装在任何直接连接到公共互联网的系统上(通过数据卡或端口转发),也可以安装在路由器后面(没有端口转发)。 / p>

使用java开发的另一个应用程序就像是在公共互联网上的服务器应用程序。现在,我的java应用程序想要将消息推送到路由器后面的C#应用​​程序。 Java应用程序具有客户端公共和私有(192.168.x.x)IP地址。 Java应用程序应该全天候运行。

所以,现在我有两种选择:

  1. 每当c#应用程序启动时,它将与java应用程序建立套接字连接,并且此套接字连接将保持打开状态,直到C#应用程序关闭。

  2. 每当Java应用程序为C#应用程序提供内容时,它将使用C#应用程序创建套接字连接,然后它将推送消息然后关闭连接。

  3. 现在,第一个选项存在一个问题,即会有大量不必要的连接,因为可能有数以千计的客户端应用程序,并且可能会发生在某一天,某些客户端将无法推送。而且我不知道如何选择第二种选择。

    完成此任务的正确方法是什么(选项1或2)?

    UPnP协议适合第二种选择吗?什么是开源UPnP库,它们都有API(C#和Java)。我发现了一个叫ohnet的人。对我来说这是对的吗?我没有为OhNet找到一个小例子进行测试。

3 个答案:

答案 0 :(得分:0)

我肯定会通过在路由器中添加静态路由(端口转发)来使用方法2。但是,您应该 - 确保路由器后面的服务器免受网络其他部分(DMZ)的影响。

更新:

也许我在这里错过了一些东西(方法1或方法2):-) - 但只是为了让它绝对清楚:始终是客户端应该启动与服务器的连接。是的,您可以允许客户定期向服务器请求更新。

答案 1 :(得分:0)

使用选项2,您是否必须为C#客户端排队消息,直到它连接为止?如果C#应用程序没有连接,这可能会使您的Java应用程序遇到内存不足问题。

答案 2 :(得分:0)

如果您无法控制客户端的网络配置,则

2)不可行。如果客户端位于任何中等安全的防火墙/路由器后面,服务器通常不可能与客户端建立连接。

因此,您通常必须使用1)的某些变体,其中客户端创建与服务器的连接。

您不一定要保持连接打开 - 始终可以让客户端定期轮询服务器以检查是否有任何新的更新。

如果您希望从服务器对客户端进行实时更新,那么您仍然需要保持连接打开。如果您使用Java NIO,这不一定是个问题,您应该能够相对轻松地处理数万个同时传入的连接。