我有一个套接字服务器侦听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();
}
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();
}
答案 0 :(得分:4)
你基本上没错,你错过了什么 即使您指定另一个端口,它将首先从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, 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需要返回该端口上的跨域文件