【发布时间】: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