2

我想使用 WCF 在不打开客户端端口的情况下启用双向通信。

我正在开发类似 P2P 应用程序(类似于 teamviewer/logmein)的东西,您不需要打开端口进行通信。

如何在客户端不打开端口的情况下通过 HTTP/HTTPS 实现双向通信?

注意:可以在服务器中打开端口 80...没有问题。

谢谢

4

2 回答 2

6

那么您提到的那些系统的工作方式如下。他们首先尝试让客户端 A 和客户端 B 通过一系列不同的拓扑直接通信,这些拓扑基本上要求其中一个允许传入连接,如果失败,他们会求助于充当中间人的第三方。因此,客户端 A 与服务器通信并向其发送消息给客户端 B。然后客户端 A 将发送给它的消息作为响应返回给它。客户端 B 将消息发送到服务器,它从客户端 A 从服务器获取消息。这样,客户端 A 和 B 始终启动连接,并且不需要为传入流量打开端口。

如果我在你的情况下理解正确,你总是希望中间的人。为此,您必须编写一个提供所有相关方法的 WCF 服务。例如像这样的事情

  • void SendMessageToClient(Guid senderId, Guid recipientId, Message msg)
  • Message[] GetMessages(Guid recipientId)

然后让这些方法分别从某个地方(如数据库或队列或其他东西)存储和检索这些 Message 对象。

然后编写一个使用 HTTP 绑定连接到 WCF 服务的客户端,并调用服务器上的方法并处理结果。

我希望你明白

  • a)这不是一种非常有效的沟通方式。
  • b)很难测试、调试和理解发生了什么,因为涉及的各方太多,并且通信是异步的,存在于 3 个不同的进程中。
  • c)它在通信之上添加了一个额外的层,因此当您处理基础设施位以及处理实际协议 clientA 和 clientB 时,您需要在头脑中(最好在代码中)保持清晰在 Message 对象中相互连接。

伪(代码)示例

在这个例子中,我假设消息对象只不过是一个字符串,唯一的命令是“whattimeisit”,它的响应是字符串形式的本地时间

  • ClientA 调用 server.SendMessageToClient("clientA", "clientB", "whattimeisit");
  • 服务器将此消息存储在 ID 为 1 的数据库中
  • ClientB 调用服务器 GetMessages("clientB");
  • 服务器检索 ID 为 1 的消息
  • ClientB 收到“whattimeisit”作为响应
  • ClientB 调用 server.SendMessageToClient("clientB", "clientA", "19:50:12");
  • 服务器将此消息存储在 ID 为 2 的数据库中
  • ClientA 调用服务器 GetMessages("clientA");
  • 服务器检索 ID 为 2 的消息
  • ClientA 收到“19:50:12”作为响应
于 2009-08-23T17:52:16.973 回答
1

我不确定我是否理解。数字防火墙的目的(通常)是控制通信通道。如果您想绕过防火墙进行通信,您有两种选择。

  1. 将消息隐藏在防火墙允许通过的地方
  2. 使用防火墙无法控制的通信通道

在前面的情况下:

您可以将消息传递给传递它们的代理(电子邮件是一个很好但不完全响应的示例)。

在后者的情况下:

您可以将消息放在其他传输层携带它们的文件中

于 2009-08-23T09:51:58.117 回答