2011-09-27 19 views
0

我创建了一个使用套接字的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)); 

在我这样做后,我可以使用normall连接。

有人可以建议为什么会发生这种情况,也许有可能没有关闭连接?

+0

我可以问*为什么*您首先使用套接字服务器?有一个非常具体的原因,或者你只是想连接到你的服务器?因为连接客户端到服务器的方法比创建自己的套接字更容易和更好,因为已经创建了很多已知的标准,并且已经有了很好的标准。 –

+0

是的,这是我们需要以特定方式与服务器通信的事情。 – simion

+0

你能说得更具描述性吗?这可能是一个更好的选择。 –

回答

0

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

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

+0

但这意味着我必须创建一个单独的线程,将监听端口843?但是没有其他解决方案吗? – simion

+0

我相信你可以为策略文件指定一个http服务器,但是不要对此表示怀疑。看看文档。 –

+0

这是主要的问题,我从文档中得出的结论是,我将不得不创建一个单独的线程来处理策略数据的请求。但我想我可以这样做,创造这个单独的线程。 – simion