服务器和客户端之间的双向通信

3

情况: 我们有一个运行在服务器上的Web应用程序。这个应用程序需要从其他PC(客户端)获取数据,这些客户端位于不同的网络上。

在客户端的计算机上,有WCF托管在Windows服务中,使用其本地的Sql db。我想让服务器和客户端之间建立双向通信,以便彼此共享数据。数据共享意味着在客户端和服务器之间共享数据表、数据集、字符串等。

问题 :

1) 我无法控制客户端PC上的防火墙、代理、NAT。大多数公司员工PC都有很多网络安全性,例如防火墙阻止ICMP流量和一些端口,某些路由器可能禁用了端口转发等等,客户端可以更改网络位置。虽然我不想在客户端路由器、代理、防火墙上进行任何设置,但在通信期间如何处理客户端的这种问题呢?正如你所知,Skype在这种情况下工作得非常完美。

防火墙经常阻止对客户端的入站连接;可能无法从服务器联系到客户端,它可能在路由器后面使用NAT转换,因此无法在路由器上设置端口转发并禁用一些新的路由器端口转发。

2) 在客户端没有IIS。

我不想允许远程访问客户端PC。

有100多个客户端和一个服务器。一个服务器需要在不同的网络上与许多客户端通信。

3) 一边我的客户端应用程序正在使用窗口应用程序和WCF托管在窗口服务中,另一边在我的服务器上我正在使用Web应用程序。这意味着通信是在桌面PC和Web PC之间进行的,这是一个问题。

如果两者都使用Web应用程序,则建立双向通信就不是问题,因为我知道WEBRTC适合那里,哈哈。

我已经测试过的技术,并发现了问题

WSDualHttpBinding: 如果客户端在NAT后面,则无法工作。点击此处了解详情。

MSMQ : 如果客户端超过1个,则是糟糕的技术,而且还会出现性能问题,因为它使用RAM内存。点击此处了解详情。

Xsocket: 如果客户端的防火墙阻止ICMP流量,则它也无法工作。点击此处

WebRTC: 它可以很好地工作,但是它支持Web到Web通信。由于我的客户端侧是win应用程序,因此不适用。

Socket.io: 它需要设置node.js和许多其他东西,难以实现,因为我需要在现有应用程序上实现,而不是创建新的应用程序。

C# Socket Program: 如果客户端在NAT后面,则无法工作。请参阅详细信息

Service Bus relay: 即使进行测试也不免费。

socketPro: 我研究了它,发现它很好,但是在谷歌上找不到任何正确的示例,以便我可以测试它。

Genuine Channels: 我在谷歌上找不到任何示例。

让我们看看SignalR问题:服务器端运行控制台应用程序,客户端运行两个应用程序,一个是控制台,另一个是Web。当我运行控制台客户端应用程序时,它无法与服务器建立连接,但是当我使用Web客户端应用程序时,它可以正常工作。示例链接在这里:SignalR双向通信。我不明白为什么会这样?

请告诉我处理此情况的最佳、最安全和最快速的方法是什么?我应该使用什么方法?

3个回答

5

SignalR似乎适合这个解决方案,因为它具有灵活性。 它协商最快可用的通信渠道,这正是您要寻找的。

您应该调查一下,SignalR最终将能够解决问题。


是的,但如我上面所解释的那样。SignalR 只在客户端 Web 浏览器应用程序使用时有效,如果使用控制台或 Windows 应用程序,则无法使用。 - Adam
1
SignalR可以在控制台应用程序中工作,这里有一个例子:https://dev59.com/3Ggu5IYBdhLWcg3ws5BC - Salvatore Sorbello
虽然SignalR最流行的是Web应用程序,但它也可以用于控制台或桌面应用程序。例如,请查看此链接:https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b - Mike W
Mike。我经过了很多测试后才发布了我的问题。 - Adam
我广泛使用SignalR在服务器(C#)之间、服务器和移动应用程序(C#, Xamarin, iOS, Android)之间进行通信。这些服务器位于不同的位置,移动应用程序可以随时随地访问。一切都非常可靠。 请查看:http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 和 http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client - Arthur Kater
显示剩余2条评论

2

0

我一直在业余时间用套接字编程(虽然是用C++,而不是C#,但应该没有什么区别),我从未遇到过无法连接防火墙/路由器后面的客户端的问题,即使没有进行端口转发。

路由器和防火墙通常不喜欢像服务器一样绑定套接字端口号的程序。你的客户端是否涉及任何与绑定相关的操作?因为它不应该绑定。

不用说,我会建议使用套接字编程。在我看来,这是最灵活的方式。


如果客户端和服务器在不同的网络上,套接字编程将无法工作。它只能在局域网上或公网上同时存在才能正常工作。如果客户端在路由器后面,则其IP地址是动态变化的,没有静态IP地址。 - Adam
只有服务器需要在路由器后面进行端口转发,或者在防火墙后面打开端口。否则我们日常使用的所有应用程序都无法正常工作,比如Skype、即时通讯软件,甚至是浏览器。基本上,客户端连接到服务器后,客户端选择接受数据包。路由器没有理由阻止数据包,因为客户端明确请求了信息,或者正在等待信息。最重要的是,它知道将传入的流量重定向到哪里。很抱歉,你说的不正确。 - xIcarus
根据您在其他答案评论中的表现,似乎您的网关或类似设备存在问题。我看不出其他原因为什么您发布的方法都无法工作。症状与您描述的完全相同:在局域网中可以工作,在广域网中无法工作。您确定您已经正确设置了吗? - xIcarus
你知道Skype是如何工作的吗?哈哈,它使用了很多技术。无论如何,如果你确定并且认为socket会起作用,那么请给我一个小的测试样例。例如:从客户端PC发送“hello”,然后在服务器上接收到它,并向该客户端返回响应。 - Adam
你是在说这个网址吗?http://www.csharp-examples.net/socket-send-receive/ - Adam
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接