【问题标题】:Actionscript Socket Events not firing?Actionscript 套接字事件未触发?
【发布时间】:2011-09-18 00:53:27
【问题描述】:

我正在编写一个 SWF,我想通过套接字与 Java 进程进行通信。这通常使用标准 Socket 很容易,但由于某种原因,当所有迹象都表明应该触发时,Socket 文档中描述的事件并没有触发。

在 Java 方面,我设置了一个 ServerSocket,它正在侦听端口 8080。使用 netcat 我已经确认它可以按设计工作。

不过,在 Flash 方面,我在文档中设置了 per the examples

public function connectToPort(port : int):void
{   
    m_socket = new Socket();

    addEventListener(Event.CLOSE, onClose);
    addEventListener(Event.CONNECT, onConnect);
    addEventListener(IOErrorEvent.IO_ERROR, onIoError);
    addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
    addEventListener(ProgressEvent.SOCKET_DATA, onData);

    m_socket.connect("localhost", port);

    // trace() doens't work for the command-line :(
    m_debug.text = "Called connect!";
}

当我运行生成的 SWF 时,我得到的只是“调用连接!”在舞台上,没有任何事件发生。更奇怪的是,当我在 Java 端调查来自 ServerSocket 的通信时,它接收并接受了一个连接。当我关闭 SWF 时,调用我的服务器的代码正常完成 - 这意味着它挂在与我的 SWF 建立的连接上。

我还有几个问题......

  • 除了事件处理程序之外,这是我的代码控制的结束(在建立连接后,我们只是等待事件并适当地呈现它们)。整个程序是否会“终止”,而我只是误解了运行时模型?
  • 对于要调用的回调是否有可见性/命名要求?它们都是公开的,但会不会是运行时没有看到它们?
  • AS3 Socket 编程有什么陷阱吗?我一直认为这是沙盒等问题,但 SECURITY_ERROR 也没有触发......

任何帮助都将不胜感激,我大部分时间都花在这上面,我非常沮丧,因为我无法让基本的套接字通信正常工作:-/

【问题讨论】:

  • 如果有帮助,我将在 Flash Debug Standalone Player 中进行大部分调试。当我从浏览器运行时,Java 端没有收到连接...
  • 不,你的程序不应该在这里终止,它应该只是静静地等待事件。不,没有特殊的命名要求。如果套接字服务器不提供策略文件响应,除非 SWF 是受信任的,否则应该会出现安全错误。

标签: flash actionscript-3 sockets networking


【解决方案1】:

看起来您正在将事件侦听器添加到“this”对象,而不是套接字。

试试这个:

m_socket.addEventListener(Event.CLOSE, onClose);
m_socket.addEventListener(Event.CONNECT, onConnect);
m_socket.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
m_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
m_socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);

您应该开始看到套接字事件。

【讨论】:

    【解决方案2】:

    这些行会将事件侦听器添加到this,而不是m_socket

    addEventListener(Event.CLOSE, onClose);
    addEventListener(Event.CONNECT, onConnect);
    addEventListener(IOErrorEvent.IO_ERROR, onIoError);
    addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
    addEventListener(ProgressEvent.SOCKET_DATA, onData);
    

    要将它们添加到m_socket,请使用

    with(m_socket) {
        addEventListener(Event.CLOSE, onClose);
        addEventListener(Event.CONNECT, onConnect);
        addEventListener(IOErrorEvent.IO_ERROR, onIoError);
        addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
        addEventListener(ProgressEvent.SOCKET_DATA, onData);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 2015-01-17
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多