flash - AS3-Flash/AIR套接字通信writeUTFBytes仅工作一次

标签 flash actionscript-3 sockets air adobe

我有一个监听2个端口的套接字服务器,其中1个端口用于套接字服务器,1个端口用于策略服务器。

我的代码在下面,在这种情况下,数据发送和接收都很好。但是,例如,如果我添加一个简单的按钮:
socket.writeUTFBytes("Message"); socket.flush();
初始连接后,似乎没有任何数据发送到我的服务器(我让我的服务器将所有数据传输打印到控制台以进行检查)初始连接工作正常,如下所示:
//authenticate with socket server first: var xmlSocket = new XMLSocket(); xmlSocket.connect("192.xx.xx.xx", 843);

try {
    Security.loadPolicyFile("xmlsocket://192.xx.xx.xx:843");
} catch (e:IOError) {
    //tbOutput.text += e.text;
}


var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);

try {
socket.connect("192.xx.xx.xx", 4444);
} catch (e:IOError) {
    //error traced
}


function onConnect(e:Event):void {
    //initial message to socket server:
    var Message:String;
    //message contains something
    socket.writeUTFBytes(Message.toString() + "<EOF>");
    socket.flush();

    }

最佳答案

您基本上是对的,只是错过了一些东西。
即使您指定另一个端口,初始连接也会保存为crossdoamin文件,它将首先尝试从4444获取文件,如果失败,则它将在默认端口(843)上作为主服务器。
这是你的冒犯线

Security.loadPolicyFile("xmlsocket://192.xx.xx.xx:843");

如果查看服务器日志,您会发现在建立第一个连接时,对服务器发出了<policy-file-request/>形式的请求。
一旦该请求完成并将文件传送给客户端,则客户端将始终关闭连接。
在客户端,一旦接收到跨域且连接已关闭,您就可以重新连接并随意发送。

因此,回顾一下。
您的Flash应用已建立与服务器的连接。
然后您的应用程序请求跨域并坐下等待
在连接超时之前,您可以继续通过连接发送某种数据
仍在等待跨域的应用收到了您服务器的响应
由于从服务器接收的数据不是crossdomain.xml文件,因此您的应用关闭了连接,将不允许重新连接

我对您的代码做了一些更改以自动重新连接
但是,当有请求时,端口4444上的服务器应返回跨域文件。
try {
  Security.allowDomain('192.xx.xx.xx');
  Security.loadPolicyFile("xmlsocket://192.xx.xx.xx:4444");
} catch (e:IOError) {
    //tbOutput.text += e.text;
}


var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);

function connect( ){
  if( !socket.connected ){
    try {
      socket.connect("192.xx.xx.xx", 4444);
    } catch (e:IOError) {
      //error traced
    }
  }
}

function onConnect(e:Event):void {
    //initial message to socket server:
    var Message:String;
    //message contains something
    //socket.writeUTFBytes(Message.toString() + "<EOF>");// EOF bad
    socket.writeUTFBytes(Message.toString() + String.fromCharCode(0) ); // NULL good
    socket.flush();

}

function onResponse(e:ProgressEvent):void {
  var read:String = this.readUTFBytes(this.bytesAvailable );

  // I test for a < since my server will never return a "<" as the first character
  // unless it is the crossdomain.xml file
  // you may need to change this for your needs
  if( read.charAt(0) !='<' ){
    if( read ){
      // so something with your response
    }
  }else{
    // recieved crossdomain policy nothing to really do here it is handled internally
  }
}


var connectTimer:Timer = new Timer( 1000 );
connectTimer.addEventListener(TimerEvent.TIMER, connect );
connectTimer.start();

别忘了让它正常工作,您的服务器在端口4444上需要在该端口上返回跨域文件

关于flash - AS3-Flash/AIR套接字通信writeUTFBytes仅工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5978480/

相关文章:

actionscript-3 - 是否有可能通过 as3 控制 iphone/android 的手电筒?

actionscript-3 - AS3 AIR在线加载mp3-错误#2044:未处理的IOErrorEvent:

node.js - Socket.io 连接恢复轮询,从不触发 'connection' 处理程序

连接到 IPv4 映射的 IPv6 地址失败

javascript - Polymer JS Polyfill 和 flash 兼容性

flash - 如何知道是 actionscript 1、actionscript 2 还是 actionscript 3?

java - 从浏览器上传多个文件的最佳方式

ios - 增加所有文本字段上的文本大小

c# - : if (OBJECT_INSTANCE is TYPE)的表现

linux - unix 域套接字有多可靠?