Web 套接字和 Flash 套接字客户端连接到一个 Node.js

Posted

技术标签:

【中文标题】Web 套接字和 Flash 套接字客户端连接到一个 Node.js【英文标题】:Web socket & Flash socket clients connect to one Node.js 【发布时间】:2014-05-28 14:08:00 【问题描述】:

我在将 Flash 客户端连接到 Node.js 服务器时遇到问题。

短篇小说

我第一次构建了一个 Node.js 服务器,它应该由 Web 客户端 (WebSocket) 和 Flash 客户端 (Socket) 使用。当然,Web 客户端就像一个魅力,但我无法克服 Flash 客户端。我得到 SECURITY_ERROR。经过一天的研究,我认为这是因为未加载策略文件。想法(engine.io 之上的首要)?

长篇大论

我正在使用Primus,因为我认为我需要它,因为我有网络套接字和闪存套接字要处理。不确定这是否准确? :)

我将Engine.io 用作“变压器/传输器”——该层使用的主要框架。我不会讨论标准的网络客户端(使用 Chrome 和 primus-client),因为它很容易设置。

我在 AS3 中使用简单和标准的 Socket:

_socket = new Socket();
_socket.addEventListener(Event.CONNECT, onSocketConnect);
//...
_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
_socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

_socket.connect('localhost', '1337);

在 Flash IDE 中构建它时,它会转到 onSocketConnect 函数,但如果我尝试向 socked 写入任何内容 - 我会断开连接。如果我从网络浏览器运行它,我会进入onSecurityError 方法。

我必须说我在节点控制台中没有任何痕迹!

primus.on('connection', function connection(spark) 
  console.log('new connection'); // never gets logged!

据我所知,当策略文件出现错误时会引发安全错误,因此我开始寻找解决方案。

我在网上阅读了很多内容,最常见的解决方案是简单地使用socket.io 和所谓的FlashSocket.IO。我尝试实现它,但它太旧了,以至于有些代码丢失了,我终于从 hurlant 库中得到了一些错误 - 我无法让它工作。

我还看到了一些名为 policy 的节点包,它运行单独的服务器来提供策略文件。

我尝试添加一个带有flashsockettransport 数组 - 没有变化。我也无法理解为什么所有样本都使用transports - 我已经搜索过index.jsprimus.js 都使用transport(为什么有两个单独的文件,耶稣?!)

我可以尝试只使用engine.io 而不使用primus,但我不知道这是否有任何帮助。我发现的所有帖子和示例都很旧 - 请帮助我提供任何最新的解决方案或至少解释需要做什么 - 对我来说似乎是一个全新的世界:)

提前致谢!

编辑: 感谢 The_asMan,我发现它与握手有关。我已经尝试过this 简单示例(尽管它已经很老了)- 对于 Flash 客户端,它工作得很好!当然,我不能将网络套接字连接到它,因为握手不正确 - 它有某种协议。

所以我想我只需要了解如何在节点中获取<policy-file-request/> - 我将能够返回策略文件。但我不知道如何获得它 - 我没有收到任何类型的 dataconnect 处理程序...

【问题讨论】:

AS3 - Flash/AIR Socket Communication writeUTFBytes only works once的可能重复 【参考方案1】:

您遇到了跨域策略问题。

我都在这里回答了。

AS3 - Flash/AIR Socket Communication writeUTFBytes only works once

【讨论】:

感谢您的回复。正如我所说 - 我知道存在政策问题,我只是不知道如何解决它:) 因为我使用的是engine.io,所以没有在那里触发connected 事件,所以我什至无法发送政策文件回来。也许握手中有一些我想念的东西.. @AndreyPopov 策略文件请求与任何其他请求一样 - 您应该能够为 url 添加处理程序并提供策略文件,不是吗? 不幸的是,正如我所说,服务器甚至没有得到connect 处理程序,因此它无法发送任何响应。我认为这是因为所有这些框架和包装器,因为最基本的实现工作。但我不只需要 Flash 套接字服务器,我想将它与 Web 套接字一起使用..【参考方案2】:

只是一个想法: 在某些操作系统上,flush() 会在执行帧之间自动调用,但在其他操作系统上,例如 Windows,除非您显式调用 flush(),否则永远不会发送数据。为确保您的应用程序在所有操作系统中可靠运行,最好在将每条消息(或相关数据组)写入套接字后调用 flush() 方法。

【讨论】:

以上是关于Web 套接字和 Flash 套接字客户端连接到一个 Node.js的主要内容,如果未能解决你的问题,请参考以下文章

从 Django 连接到外部 Web 套接字 api

从 reactjs 客户端连接到安全 Web 套接字 python 服务器

Android 中的 ActionScript 套接字

通过主机名连接到 Java 套接字

Flash 和 AIR 中的套接字编程......两个客户端,一个服务器。监听两个端口还是一个?

在客户端编程 Web 套接字?