【问题标题】:Problem with socket communication between C# and FlexC# 和 Flex 之间的套接字通信问题
【发布时间】:2010-05-18 06:49:00
【问题描述】:

我正在实施一个模拟的 b/s 库存数据系统。我在客户端和服务器端使用 flex 和 c#。我发现 flash 有一个安全策略,并且我在我的服务器代码中处理了策略文件请求。但似乎它不起作用,因为连接后代码在“socket.Receive(b)”处跳出。我已经尝试在连接处理程序中的客户端上发送消息,在这种情况下服务器可以接收正确的消息。但是自动生成的“policy-file-request”永远收不到,客户端也收不到服务器发送的数据。在这里,我放了我的代码 sn-p。

我的 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;
            }
        }
    }

对不起,代码太长,请有人帮忙,谢谢一百万

【问题讨论】:

  • 我使用wireshark抓包,发现没有发送到服务器。我在 connectHandler 中调用了 send("begin") 方法。现在服务器用它响应并发送回数据,但是 dataHandler 仍然没有被触发,虽然我可以在 wireshark 中看到响应数据。它是有线的:[

标签: c# apache-flex sockets


【解决方案1】:

这是因为套接字策略文件不是在您尝试加入的端口上请求的,而是在静态端口 843 上请求的。

您应该侦听端口 843 来处理策略请求。此外,在发送策略文件后立即关闭套接字时我遇到了一些问题。在发送策略文件后,似乎应该让套接字保持打开状态几秒钟,否则 Flash 可能会直接放弃答案。

请注意,通过这种方式,您可以为来自其他应用程序的策略文件请求提供服务,而不必从您的主服务器提供。

this documentation 中描述了全部内容。

【讨论】:

  • 嗨,Tyn,感谢您的回复,我监听了 843 端口,但没有收到任何请求。我只是重写了我的服务器代码,使用 TcpClient 和 Stream 来处理请求,现在我的客户端可以触发 ProgressEvent.SOCKET_DATA 事件,我可以在我的 AJAX 代码中处理数据。我不知道为什么没有策略文件请求,尽管我在 2 台 PC 上运行 Web 客户端和服务器。这不是解决方案,但对我有用。
  • 尝试从不同的系统托管服务器。我认为 Flash 播放器不会发送策略文件请求,除非它从 Web 服务器后面转到单独的域。
  • 谢谢拉卡斯,我知道出了什么问题。我只是通过在我的本地文件系统中打开它来测试页面。当我将它部署到 Web 容器时,会发送策略文件请求,我按照 Tyn 所说的方式处理它并且它可以工作。干杯,谢谢。
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2018-01-09
相关资源
最近更新 更多