2010-05-18 73 views
1

我正在实现一个模拟的B/S股票数据系统。我为客户端和服务器端使用flex和c#。我发现闪存有一个安全策略,我在我的服务器代码中处理策略文件请求。但似乎它不起作用,因为代码在连接后跳出“socket.Receive(b)”。我试过在连接处理程序中的客户端上发送消息,在这种情况下,服务器可以收到正确的消息。但是自动生成的“策略文件请求”永远不会被接收,并且客户端不能从服务器获得数据发送。在这里,我把我的代码片段。C#和Flex之间的套接字通信问题

我ActionScript代码:

public class StockClient extends Sprite { 
    private var hostName:String = "192.168.84.103"; 
    private var port:uint = 55555; 
    private var socket:XMLSocket; 

    public function StockClient() { 
     socket = new XMLSocket(); 
     configureListeners(socket); 
     socket.connect(hostName, port); 
    } 

    public function send(data:Object) : void{ 
     socket.send(data); 
    } 

    private function configureListeners(dispatcher:IEventDispatcher):void { 
     dispatcher.addEventListener(Event.CLOSE, closeHandler); 
     dispatcher.addEventListener(Event.CONNECT, connectHandler); 
     dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
     dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
     dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
dispatcher.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); 
    } 

    private function closeHandler(event:Event):void { 
     trace("closeHandler: " + event); 
    } 

    private function connectHandler(event:Event):void { 
     trace("connectHandler: " + event); 
     //following testing message can be received, but client can't invoke data handler 
//send("<policy-file-request/>"); 
    } 

    private function dataHandler(event:ProgressEvent):void { 
     //never fired 
     trace("dataHandler: " + event); 
    } 

    private function ioErrorHandler(event:IOErrorEvent):void { 
     trace("ioErrorHandler: " + event); 
    } 

    private function progressHandler(event:ProgressEvent):void { 
     trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal); 
    } 

    private function securityErrorHandler(event:SecurityErrorEvent):void { 
     trace("securityErrorHandler: " + event); 
    } 
} 

我的C#代码:

const int PORT_NUMBER = 55555; 
    const String BEGIN_REQUEST = "begin"; 
    const String END_REQUEST = "end"; 
    const String POLICY_REQUEST = "<policy-file-request/>\u0000"; 
    const String POLICY_FILE = "<?xml version=\"1.0\"?>\n" + 
     "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">\n" + 
     "<cross-domain-policy> \n" + 
     " <allow-access-from domain=\"*\" to-ports=\"55555\"/> \n" + 
     "</cross-domain-policy>\u0000";   
    ................ 

    private void startListening() 
    { 
     provider = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     provider.Bind(new IPEndPoint(IPAddress.Parse("192.168.84.103"), PORT_NUMBER)); 
     provider.Listen(10); 
     isListened = true; 

     while (isListened) 
     { 
      Socket socket = provider.Accept(); 
      Console.WriteLine("connect!"); 
      byte[] b = new byte[1024]; 
      int receiveLength = 0; 
      try 
      { 
       // code jump out at this statement 
       receiveLength = socket.Receive(b); 
      } 
      catch (Exception e) 
      { 
       Debug.WriteLine(e.ToString()); 
      } 
      String request = System.Text.Encoding.UTF8.GetString(b, 0, receiveLength); 

      Console.WriteLine("request:"+request); 

      if (request == POLICY_REQUEST) 
      { 
       socket.Send(Encoding.UTF8.GetBytes(POLICY_FILE)); 
       Console.WriteLine("response:" + POLICY_FILE); 
      } 
      else if (request == END_REQUEST) 
      { 
       Dispose(socket); 
      } 
      else 
      { 
       StartSocket(socket); break; 
      } 
     } 
    } 

很抱歉的长码,请别人帮忙吧,万分感谢

+0

我使用wireshark来封装包,发现没有已经发送到服务器。我在connectHandler中调用send(“begin”)方法。现在服务器响应它并发回数据,但dataHandler仍然没有被触发,尽管我可以在wireshark中看到响应数据。它是有线的:[ – 2010-05-18 09:33:04

回答

1

那是因为插座策略文件不是在您尝试加入的端口上请求的,而是在静态端口843上请求的。

您应该监听端口843来服务策略请求。另外,在发送策略文件后立即关闭套接字时遇到了一些问题。看来策略文件发送后,套接字应该保持打开几秒钟,否则Flash可能会简单地放弃答案。

请注意,通过这种方式,您可以从另一个应用程序提供策略文件请求,而不是从主服务器中请求。

整个东西在this documentation中描述。

+0

嗨Tyn,谢谢你的回复,我听了843端口,它没有得到任何请求。我只是重写我的服务器代码,使用TcpClient和Stream来处理请求,现在我的客户端可以触发ProgressEvent.SOCKET_DATA事件,并且我可以在我的AJAX代码中处理数据。我不知道为什么没有策略文件请求,尽管我在2台PC上运行Web客户端和服务器。这不是解决方案,但为我工作。 – 2010-05-19 05:41:35

+0

尝试从不同的系统托管服务器。我不认为Flash播放器会发送策略文件请求,除非它从Web服务器后面进入单独的域。 – 2010-05-19 17:38:55

+0

感谢Lacasse,我知道什么是错的。我只是通过在本地文件系统中打开它来测试页面。当我将它部署到Web容器时,发送策略文件请求,我按照Tyn的说法处理它,并且它可以工作。干杯,谢谢。 – 2010-05-27 02:14:05

相关问题