0

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

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

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

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

  2. 每当 Java 应用程序有 C# 应用程序的东西时,它都会与 C# 应用程序创建一个套接字连接,然后它将推送消息然后关闭连接。

现在,使用第一个选项存在一个问题,即会有很多不必要的连接,因为可能有数千个客户端应用程序,并且可能会发生在某天没有什么可以推送给某些客户端。而且我不知道如何选择第二个选项。

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

UPnP 协议是否适合第二个选项?什么是同时具有 API(C# 和 Java)的开源 UPnP 库。我找到了一个叫ohnet 的。这对我来说是正确的吗?我没有找到一个供 OhNet 测试的小例子。

4

3 回答 3

0

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

更新:

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

于 2012-10-29T08:33:50.197 回答
0

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

于 2012-10-29T08:53:25.463 回答
0

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

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

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

If you want realtime updates to the client from the server then you will still need to keep a connection open. This isn't necessarily a problem if you use Java NIO you should be able to handle tens of thousands of simultaneous incoming connections relatively easily.

于 2012-10-29T09:24:16.297 回答