AS3 – Flash/AIR套接字通信writeUTFBytes只能运行一次
|
我有一个套接字服务器监听2个端口,1个端口用于套接字服务器,1个端口用于策略服务器.
我的代码如下,在这种情况下,数据发送和接收完全正常.但是,例如,如果我添加一个简单的按钮: ????socket.writeUTFBytes( “消息”); 在初始连接之后,它似乎没有向我的服务器发送任何数据(我的服务器打印所有数据传输到控制台进行检查)初始连接工作正常,如下所示: ????//首先使用socket服务器进行身份验证: 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 />制作到服务器. 所以回顾一下. 我将代码更改为自动重新连接 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上运行您的服务器需要返回该端口上的跨域文件 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 滚蛋吧,XML 君
- ruby-on-rails – fixture_file_upload有{file}不
- 在phonegap应用程序中导出sqlite db
- JSONObject包导入异常 java.lang.NoClassDefFoun
- c# – .NET的Browser Emulator API
- c# – 更改System.Dynamic.ExpandoObject的默认行
- c# – 在Console App中反序列化Json
- DWR的基本原理以及前后台互相调用并整合SPRING的
- c# – 在第三方库中调用麻烦的GC.collect()
- iphone – 类似UITableView的NSTableView
