AS3套接字和策略文件请求到C#服务器

时间:2013-04-12 17:55:21

标签: c# actionscript-3 flash sockets policy

这个问题让我抓狂!我已经阅读了所有关于Stack Overflow的问题,但我仍然卡住了。

我的as3程序工作得非常好,但是当我完成并将其放在服务器上时,它就会开始请求这个着名的策略文件。

AS3脚本:

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

socket.connect( MYHOST, 4242 );

C#服务器代码:

TcpListener serverSocket = new TcpListener(4242);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
clientSocket = serverSocket.AcceptTcpClient();
NetworkStream networkStream = clientSocket.GetStream();
StreamReader read = new StreamReader(networkStream, Encoding.UTF8);
StreamWriter write = new StreamWriter(networkStream, Encoding.UTF8);

response = read.ReadLine();

if (response.Contains("policy"))
{
 write.Write("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0");
 write.Flush();
 clientSocket.Close();
 return;
}

因此,当AS3在默认端口843(或类似的东西)上找不到策略时,它直接在与连接相同的套接字上询问。 我的C#代码看到请求和回复,之后AS3脚本关闭连接(这是正常的),但它永远不会重新连接。

我试过把它放在AS3 之前 connect():

Security.loadPolicyFile( "xmlsocket://myhost.com:4242");

但是,当我执行connect()时,它只会卡住并且永远不会请求策略文件。关闭AS3应用程序后,我的服务器会看到请求,但连接已关闭。这就像客户忘记冲洗一样。

有人可以告诉我如何正确解决这个问题吗?

2 个答案:

答案 0 :(得分:6)

3天后,我终于发现了代码中的错误。

50分的赏金,没人注意到: - (

非常愚蠢,新手错误:

当flash应用程序请求策略文件时,不要发送换行符,而是终止字符'\ 0'。

并使用read.ReadLine()读取;读到'\ n',所以它卡住了。

谢谢大家的回复。

答案 1 :(得分:0)

我遇到了类似于你的问题。事实是,在将Flash应用程序运行到C#时,它会丢失很多与端口不同的请求。解决方案是不要在Flash中使用此类请求。因此,您必须将它们放入C#中,并使用Flash的ExternalInterface.call调用此函数。请求完成后,您的C#必须调用Flash函数,并将req的答案作为参数传递。