【问题标题】:Two-way Communication between Server and Clients服务器和客户端之间的双向通信
【发布时间】:2015-01-05 12:28:48
【问题描述】:

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

在客户的电脑上,WCF 使用其本地 Sql db 托管在 Windows Services 中。我想在服务器和客户端之间进行双工通信以相互共享数据。 数据共享是指在客户端和服务器之间共享数据表、数据集、字符串等。

问题:

1) 我无法控制客户端 PC 上的防火墙、代理、NAT。大多数公司员工 PC 具有很多网络安全性,例如防火墙阻止 ICMP 流量和一些端口,一些路由器可能禁用端口转发等,客户端可以更改网络位置。 我不想在客户端路由器、代理、防火墙上进行任何设置。 在沟通过程中,我该如何处理客户端的这种问题? 如您所知,Skype 在这种情况下运行良好。

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

2) 在客户端没有 IIS。

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

有超过 100 个客户端,只有一个服务器。一台服务器需要与不同网络上的多个客户端进行通信。

3) 一方面我的客户端应用程序正在使用窗口应用程序和托管在窗口服务中的 wcf,而在我的服务器上的另一端我正在使用 Web 应用程序。所以它的平均通信是在台式电脑和网络电脑之间,这是问题。

如果两者都使用 Web 应用程序,那么进行双向通信就没有问题。因为我知道 WEBRTC 适合那里哈哈。

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

WSDualHttpBinding: 如果客户端在 NAT 后面,则不起作用。详情请查看click here

MSMQ :如果客户端超过 1 个,它的技术不好,性能问题也因为它使用 RAM 内存。在这里查看click here

Xsocket: 如果 ICMP 流量被客户端上的防火墙阻止,它也不起作用。在这里查看click

WebRTC:它工作正常,但它支持网络到网络通信。作为我的客户端,我有 win 应用程序。

Socket.io: 它需要设置 node.js 和许多其他的东西,很难实现,因为我需要在现有应用程序上实现,我没有做新的应用。

C# Socket 程序: 如果客户端在 NAT 后面,它就无法工作。请在此处查看 click for detail

Service Bus 中继:即使是测试也不是免费的。

socketPro:我研究了一下,发现它很好,但我在谷歌上找不到任何合适的样本。所以我可以测试它。

正版频道:我在 google 上找不到任何示例。

让我们看看 SignalR 问题。: 服务器端我运行一个控制台应用程序,客户端我运行两个应用程序,一个是控制台,另一个是 Web。当我运行控制台客户端应用程序时,它没有启动与服务器的连接,但是当我使用 Web 客户端应用程序时,它工作正常。 示例链接在这里SignalR two way communication 我不明白为什么会这样??

请告诉我处理这种情况最安全、最快捷的方法是什么?我应该使用什么方法?

【问题讨论】:

    标签: c# asp.net wcf sockets networking


    【解决方案1】:

    SignalR 似乎适合这个解决方案,因为它很灵活。 它会协商最快的可用通信渠道,而这正是您所寻找的。​​p>

    您应该调查它的问题,signalR 最终会起作用。

    【讨论】:

    • 是的,但正如我在上面解释的那样。如果使用客户端 Web 浏览器应用程序,signalR 工作,如果使用控制台或 win 应用程序,它将无法工作..
    • SignalR 将在控制台应用程序中工作,请看这里:stackoverflow.com/questions/11140164/…
    • 虽然 SignalR 在 Web 应用程序中最流行 - 它也可以在控制台或桌面应用程序中使用。例如检查此链接:code.msdn.microsoft.com/windowsdesktop/…
    • 迈克,你的样品我从 1 个月前就开始尝试了,哈哈。它在我的情况下真的不起作用,我已经解释过,如果我将在客户端使用 broswer 应用程序,那么它会起作用,如果将使用控制台应用程序然后它不会给出任何错误但也不会启动连接..
    • 迈克。经过大量测试,我已经发布了我的问题。
    【解决方案2】:

    我广泛使用 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

    【讨论】:

      【解决方案3】:

      我在业余时间一直在使用套接字(诚然是在 c++ 中,而不是 c#,但应该没有区别),我从来没有遇到过连接到防火墙/路由器后面的客户端的问题,即使没有转发端口。

      路由器和防火墙通常不喜欢类似服务器的程序,例如。将套接字绑定到端口号的程序。您的客户是否做任何与绑定相关的事情?因为它不应该。

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

      【讨论】:

      • 如果客户端和服务器在不同的网络上,套接字编程就不起作用。它只有在 LAN 网络上才起作用。或者两者都在实时IP上。你知道如果路由器后面的客户端那么它没有静态IP。它的IP总是改变。
      • 如果服务器在路由器后面,则只有服务器需要转发其端口,如果在防火墙后面,则需要打开端口。我们所有的日常应用程序将如何工作? Skype、Messenger,甚至网络浏览器。基本上,客户端连接到服务器。建立连接后,客户端选择接受数据包。路由器没有理由阻止数据包,因为客户端专门请求了信息,或者它正在等待信息。最重要的是,它知道将传入流量重定向到何处。对不起,你说的不是真的。
      • Ps,从您的其他 cmets 对其他答案的判断来看,您的网关或类似问题似乎有问题。我看不出您发布的方法都不起作用的另一个原因。症状与您描述的完全一样:适用于局域网,不适用于广域网。您是否 100% 确定设置正确?
      • 你知道Skype是如何工作的吗?哈哈,它使用了这么多技术。无论如何,如果您确定并且您认为套接字会起作用。那就给我小样做测试吧。像 hello 这样的示例从客户端 pc 发送,然后在服务器上接收它,服务器响应返回给该客户端。
      • csharp-examples.net/socket-send-receive 。你在说它吗??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多