策略文件检查关闭套接字

时间:2011-09-27 14:10:47

标签: flex sockets cross-domain-policy

我创建了一个使用套接字的flex应用。我在一个在glassfish服务器上运行的Web应用程序中发布了flex应用程序。 现在,从该Flex应用程序,我创建一个到C#服务器的套接字连接,并开始发送/接收数据。 问题是,在我创建到C#服务器的套接字连接之后,flex应用程序首先检查策略文件,然后在获取它之后,它关闭套接字,而不保持连接活动。

这是我的C#服务器:

TcpListener tcpListener = new TcpListener(IPAddress.Parse("172.17.41.211"), 12345);
TcpClient tcpclient = tcpListener.AcceptTcpClient();

Socket client = tcpclient.Client;
while (client.Available > 0)
{
   int bytes = 0;
   byte[] m_aBuffer = new byte[1024];
   bytes = client.Receive(m_aBuffer, m_aBuffer.Length, SocketFlags.None);
   String str = Encoding.ASCII.GetString(m_aBuffer, 0, bytes);
   if (str.StartsWith("<policy-file-request/>"))
   {
      sendBytes = Encoding.ASCII.GetBytes("<cross-domain-policy><allow-access-from domain=\"172.17.41.211\" to-ports=\"12345\"/></cross-domain-policy>\0");
      client.Send(sendBytes);
   }
}

while (client.Connected)
{
   Thread.Sleep(200);
   sendBytes = Encoding.ASCII.GetBytes("message to client");
   client.Send(sendBytes, sendBytes.Length, SocketFlags.None);
}

现在,flex客户端看起来像:

private var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onData);
socket.addEventListener(ErrorEvent.ERROR, errorHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
...
socket.connect("172.17.41.211", 12345);    
...

现在,在我创建连接并从服务器获取策略后,它会关闭此套接字,因此为了能够使用此连接,我必须再次调用

socket.connect("172.17.41.211", 12345));

执行此操作后,我可以正常使用连接。

有人可以建议为什么会发生这种情况并且可能没有关闭连接吗?

1 个答案:

答案 0 :(得分:0)

您不通过套接字本身发送策略文件。它需要在不同的渠道上。例如,如果您连接到某个IP /端口,默认情况下,闪存将尝试连接到同一个IP但在端口843上,并查找主策略文件。

您也可以使用Security.loadPolicyFile(someURL)手动设置。 More information can be found here