加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

AS3 – Flash/AIR套接字通信writeUTFBytes只能运行一次

发布时间:2020-12-15 19:48:17 所属栏目:百科 来源:网络整理
导读:我有一个套接字服务器监听2个端口,1个端口用于套接字服务器,1个端口用于策略服务器. 我的代码如下,在这种情况下,数据发送和接收完全正常.但是,例如,如果我添加一个简单的按钮: ????socket.writeUTFBytes( “消息”); ????socket.flush(); 在初始连接之后,它
我有一个套接字服务器监听2个端口,1个端口用于套接字服务器,1个端口用于策略服务器.

我的代码如下,在这种情况下,数据发送和接收完全正常.但是,例如,如果我添加一个简单的按钮:

????socket.writeUTFBytes( “消息”);
????socket.flush();

在初始连接之后,它似乎没有向我的服务器发送任何数据(我的服务器打印所有数据传输到控制台进行检查)初始连接工作正常,如下所示:

????//首先使用socket服务器进行身份验证:
????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();

    }

解决方法

你基本上没错,你错过了什么.
即使您指定了另一个端口,它将首先从4444获取文件,如果失败,那么它将为默认端口(843)上的主控制器保存初始连接.
这是你的违规行

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

如果您查看服务器日志,您会发现在第一次连接时,有一个请求,其形式为< policy-file-request />制作到服务器.
完成该请求并将文件传递给客户端后,客户端将始终关闭连接.
在客户端,一旦收到跨域并关闭连接,您就可以重新连接并随意发送.

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

我将代码更改为自动重新连接
但是,端口4444上的服务器应该在有请求时返回crossdomain文件.

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,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上运行您的服务器需要返回该端口上的跨域文件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读