我想使用 WCF 启用双向通信,而无需在客户端上打开端口。
我正在开发类似 P2P 应用程序(类似于 teamviewer/logmein)的东西,您不需要打开端口进行通信。
如何通过 HTTP/HTTPS 完成双向通信,而不需要在客户端中打开端口?
注意:端口 80 可以在服务器中打开...没有问题。
Thanks
那么您提到的那些系统的工作原理如下。他们首先尝试让客户端 A 和客户端 B 通过一系列不同的拓扑直接通信,这些拓扑基本上要求其中一个允许传入连接,如果失败,他们就会求助于充当中间人的第三方。因此,客户端 A 与服务器通信并向其发送客户端 B 的消息。然后客户端 A 收到发送给它的消息作为响应。客户端 B 将消息发送到服务器,然后它从服务器获取客户端 A 的消息。这样,客户端 A 和 B 始终都会发起连接,并且不需要为传入流量打开端口。
如果我对你的情况理解正确的话,你总是想要中间的那个人。为此,您必须编写一个提供所有相关方法的 WCF 服务。例如像这样的事情
- void SendMessageToClient(Guid 发送者 ID, Guid 接收者 ID, 消息 msg)
- Message[] GetMessages(Guid 收件人 ID)
然后让这些方法分别从某个地方(例如数据库或队列或其他东西)存储和检索这些 Message 对象。
然后编写一个使用 HTTP 绑定连接到 WCF 服务的客户端,并调用服务器上的方法并处理结果。
我希望你明白这一点
-
a)这不是一种非常有效的沟通方式。
-
b)由于涉及的各方太多,并且通信是异步存在于 3 个不同的进程中,因此很难测试、调试和理解正在发生的事情。
-
c)它在通信之上添加了一个额外的层,因此当您处理基础设施位以及处理实际协议 clientA 和 clientB 相互交谈时,您需要在头脑中(最好是在代码中)保持清晰的状态Message 对象中的其他内容。
伪(代码)示例
在这个例子中,我假设消息对象只不过是一个字符串,唯一的命令是“whattimeisit”,其响应是字符串形式的本地时间
- ClientA 调用 server.SendMessageToClient("clientA", "clientB", "whattimeisit");
- 服务器将此消息存储在ID为1的数据库中
- 客户端调用服务器 GetMessage("client");
- 服务器检索 ID 为 1 的消息
- 客户端收到“whattimeisit”作为响应
- 客户端调用服务器。发送消息 Client("clientE", "clientA", "19:50:12");
- 服务器将此消息存储在ID为2的数据库中
- ClientA 调用服务器 Get Messages("clientS");
- 服务器检索 ID 为 2 的消息
- 客户端收到“19:50:12”作为响应
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)