WCF 双向 HTTP 通信绕过防火墙

2024-02-09

我想使用 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(使用前将#替换为@)

WCF 双向 HTTP 通信绕过防火墙 的相关文章

随机推荐

  • 简单的伪随机算法

    我需要一个伪随机生成器 它将一个数字作为输入并返回另一个数字 该数字是可再现的并且似乎是随机的 每个输入数字应与一个输出数字完全匹配 反之亦然 相同的输入数字总是导致相同的输出数字 靠近的连续输入数字 例如 1 和 2 应该产生完全不同的输
  • 为 i18n 设计属性?

    如何翻译 Devise 模型的属性 例如 session email or session remember me 两个层次结构 de devise sessions email E Mail and de activerecord att
  • Java中的“自动递增”字母表?

    Java 中的 自动增量 字母表 这可能吗 从头到尾没有第三方库 是的 你可以这样做 for char alphabet A alphabet lt Z alphabet System out println alphabet 也可以通过类
  • 在同一查询中混合 HQL 和 SQL

    我正在尝试在同一个查询中混合 HQL 和 SQl 喜欢使用 来自 Object 对象 TABLE B tbl 其中 obj simeProp tbl COLUMN 因为我的客户需要修改查询 学习 HQL 或映射未映射的表是不可能的 如果不是
  • SQL,缺少结尾,但为什么呢?

    我对 mySQL 过程有疑问 MySQL Workbench 建议我它错过了我的第一个 SET 的 结束 但没有错过第二个 SET 的 结束 我不知道为什么 DELIMITER drop procedure if exists pay10p
  • 使用 zxing 解码时返回图像中的条形码位置

    在我当前的项目中 我需要知道如何使用 zxing 获取图像中条形码的位置 以像素或像素范围为单位 我的图像源是 Kinect v2 主要目的是将条形码与车身框架关联起来 这需要位置信息 我使用的是标准 Kinect v2 SDK 和 Vis
  • 使用 VS Android 模拟器运行调试时 Xamarin Forms Android 应用程序崩溃

    我创建了一个基本的 Xamarin Forms 应用程序 它在 iOS 模拟器上运行良好 然而 当我尝试使用 VS Android 模拟器 5 1in Marshmallow 运行时 它每次打开时都会崩溃 即使我尝试在没有调试的情况下运行
  • 使用 Java2D 绘制多个圆

    我正在尝试使用Java2D 进行一些简单的图形编程 我开始很简单 只是尝试在 JFrame 中显示几个圆圈 我成功显示了一个圆圈 但是当添加第二个圆圈时 仅显示添加到 JFrame 的最后一个圆圈 我使用 Circle 类来定义我的圆并重写
  • 为什么 Django 站点不能嵌入另一个 HTML(iframe)中?

    我尝试在另一个 html 页面中嵌入 django 表单 但它不起作用 我尝试了其他 django 网站 但没有任何效果 还对其他一些网站进行了测试 django 是否限制在 iframe 中使用 如何让它发挥作用 需要嵌入的表格编程竞赛形
  • 如何为 AngularStrap datetimepicker 显示“无效日期”验证消息

    我能够验证我的 AngularStrap 日期时间选择器 但我无法区分所需的验证失败和无效的日期失败 屏幕上显示的唯一错误是必需的错误 无论它是必需的还是无效的字符串 如果输入的字符串无效 是否可以显示不同的验证消息 这是我的代码 div
  • 从锯齿状数组初始化中省略 c# new

    From http msdn microsoft com en us library 2s05feca aspx http msdn microsoft com en us library 2s05feca aspx 请注意 您不能在元素初
  • 在 WPF TreeView 中对子对象进行分组

    我试图让我的树视图根据相似项目的内容对它们进行分组 为了保持通用 我的对象层次结构可能如下所示 Objects Object Group 1 项目 1 类型 A 项目 2 类型 A 项目 3 类型 B 项目 4 类型 B 现在 我的 Tre
  • 洗牌算法分析

    我遇到了以下洗牌算法的分析 问 给定一个不同整数的数组 给出一个算法来随机 对整数重新排序 以便每个可能的重新排序都是相等的 可能 换句话说 给定一副牌 你如何洗牌 使得任何牌的排列都是同样可能的 好答案 按顺序遍历元素 将每个元素与 数组
  • Python struct.pack() 用于列表中的各个元素?

    我想将列表中的所有数据打包到单个缓冲区中以通过 UDP 套接字发送 该列表相对较长 因此为列表中的每个元素建立索引非常繁琐 这是我到目前为止所拥有的 NumElements len data buf struct pack d NumEle
  • 如何使用 awk 在文件中的模式后打印 5 个连续行[重复]

    这个问题在这里已经有答案了 我想在文件中搜索模式并在找到该模式后打印 5 行 我需要使用awk为此 例子 文件内容 PATTERN Line1 Line2 Line3 Line4 Line5 如何解析文件并仅打印上述行 我是否使用包含 PA
  • 无需用户服务的 Spring Security X.509 身份验证

    我在我的 Web 应用程序中使用 Spring Security v3 1 3 进行 X 509 身份验证 用户和角色存储在数据库中 但我实际上不需要这样做 因为客户端证书的 CN 符合 ROLE USERNAME 模式 这意味着我已经拥有
  • Javascript 日期验证 (DD/MM/YYYY) 和年龄检查

    我最近开始研究Javascript 我正在测试的是检查 DoB 的有效格式 下一步将检查年龄 我的 HTML 代码包含的内容如下
  • 将 CurrentDirectory 从未提升的脚本传输到提升的脚本

    我需要将文件 manufacturer bmp 复制到与脚本位于同一目录中 在我的闪存驱动器中 system32目录 我成功地获得了变量sourcefile destinationdirectory 并提升我的脚本 但是当我提升它时 我的s
  • ColdFusion:查询中存在多个 SQL 语句?

    显然 ColdFusion 不喜欢单个查询中的多个 SQL 语句 那么这曾经是什么 SET sender user id 3 recipient user id 5 INSERT INTO messages message type sen
  • WCF 双向 HTTP 通信绕过防火墙

    我想使用 WCF 启用双向通信 而无需在客户端上打开端口 我正在开发类似 P2P 应用程序 类似于 teamviewer logmein 的东西 您不需要打开端口进行通信 如何通过 HTTP HTTPS 完成双向通信 而不需要在客户端中打开