【问题标题】:Flex socket connection弹性插座连接
【发布时间】:2011-12-26 16:40:39
【问题描述】:

我有一个 Groovy 服务器和 Flex 客户端。当我尝试从 Flex 连接到 Groovy 应用程序时,我收到了 <policy-file-request/> 消息。然后我发送一些策略 XML 响应并尝试向服务器发送一些内容。但是,我没有在 Groovy 方面收到任何东西,而是什么都没有。几秒钟后,我在 Flex 应用程序端收到了 SecurityException

Groovy 服务器代码:

import java.util.Scanner

class server
{
    public static handleConnection(client)
    {
        PrintWriter socketwriter = new PrintWriter(client.getOutputStream())

        Scanner socketreader = new Scanner(client.getInputStream())

        while (socketreader.hasNext())
        {
            String s = socketreader.nextLine()

            println s

            if (s =~ /<policy-file-request\s*\/>/)
            {

                socketwriter.print("<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><site-control permitted-cross-domain-policies=\"master-only\" /><allow-access-from domain=\"*\" to-ports=\"2900-2910\" /></cross-domain-policy>\n\0\n")

                socketwriter.flush()
                socketwriter.close()
                client.close()

                println "Policy File sent."

                return
            }
        }

        socketwriter.print("Connection: Done.\n")
        socketwriter.flush()

        socketwriter.close()
        socketreader.close()
    }

    static main(args)
    {
        ServerSocket serversocket

        try
        {
            serversocket = new ServerSocket(2900)

            println "Server is up and running"

            while (true)
            {
                Socket client = serversocket.accept()

                Thread.start {
                    server.handleConnection(client)
                }
            }
        } catch (e)
        {
            e.printStackTrace()
        } finally
        {
            serversocket.close()
        }
    }
}

Flex 客户端代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import flash.net.Socket;
            import flash.events.*;
            import mx.controls.Alert;

            private var socket : Socket;

            private function connect() : void 
            {
                socket = new Socket();

                socket.addEventListener(Event.CONNECT, onConnect);
                socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
                socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError);

                socket.connect("localhost", 2900);

                Alert.show("yay!");
            }

            private function ServerSecurityError(evt : Event) : void
            {
                Alert.show("security error")
            }

            private function onConnect(evt : Event) : void
            {
                Alert.show("Connected to server!");
            }

            private function onSocketData(evt : ProgressEvent) : void
            {
                var data : String = socket.readUTFBytes(socket.bytesAvailable);
                Alert.show("Read: " + data);
            }

            private function send() : void 
            {
               var msg : String = "Hello, World!";
               socket.writeUTFBytes(msg);
               socket.flush();
               Alert.show("Sent: " + msg);
            }
        ]]>
    </mx:Script>

    <mx:Button label="connect" click="connect()" x="10" y="10" />
    <mx:Button label="send something" click="send()" x="10" y="40" />
</mx:Application>

那么,问题是:我应该如何连接才能在服务器和客户端之间获得稳定的通信?

【问题讨论】:

  • 我认为您应该向我们提供完整的错误信息。我的猜测是这是一个跨域问题。 SWF 是否在 groovy 服务器上提供?
  • @www.Flextras.com 感谢您的回复。我在ServerSecurityError 方法中收到错误消息。您对我如何在此处获取错误消息有任何想法吗?
  • 所有相关信息都应该在发送到该方法的事件中。

标签: flash apache-flex sockets groovy client-server


【解决方案1】:

SecurityError 出现的原因如下(来自文档):

  • 本地不受信任的 SWF 文件无法与 Internet 通信。你 可以通过将文件重新分类为 本地网络或受信任。
  • 您不能指定套接字端口 高于 65535。
  • 在包含 SWF 内容的 HTML 页面中, object 和 embed 标签的 allowNetworking 参数设置为 “无”。

我们正在运行类似的设置(使用纯 AS3 前端),在调用 connect() 之前,我调用:

Security.loadPolicyFile( "xmlsocket://" + this.m_host + ":" + this.m_policyFilePort );

m_host 可以是“localhost”之类的东西,m_policyFilePort 是您为其提供服务的任何端口。您可以在hereat the Socket files 找到更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多