我知道有很多人已经问过这个问题,但在我读过的所有帖子中,我找不到解决问题的方法(即使其他人有同样的问题,但对我来说也不行)。
正如标题所说,我正在尝试从Flash / SWF-Application连接到我通过套接字编写的小型Java服务器。它可以脱机工作(在同一台机器上),但只要将.swf放在Webspace上并从那里打开它,Flash就会从服务器请求Policy文件。这没有什么不好,但我的问题是Flash在(希望)获取策略文件后断开连接但不再重新连接。
我的服务器总是在客户端连接时打开一个新线程,但这不是问题所在,因为我已经尝试过而没有打开新的线程。
这是我的代码:
while (true) {
connection = providerSocket.accept();
System.out.println("Incoming connection from " +
connection.getInetAddress().getHostName());
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String request = in.readLine();
if (request != null && request.contains("<policy-file-request/>")) {
System.out.println("Authorization request.");
PrintStream out = new PrintStream(connection.getOutputStream(), true);
out.println("<?xml version=\"1.0\"?><cross-domain-policy><!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><allow-access-from domain=\"*\" to-ports=\"3002\" /></cross-domain-policy>\u0000");
out.flush();
System.out.println("AuthData sent.");
connection.close();
System.out.println("Authorization complete.");
connection = providerSocket.accept();
System.out.println("TEST");
RequestProcessor c = new RequestProcessor(connection, connectionCounter++);
Thread t = new Thread(c);
t.start();
} else {
RequestProcessor c = new RequestProcessor(connection, connectionCounter++);
Thread t = new Thread(c);
t.start();
}
}
你肯定会注意到我在结尾使用“\ u0000”而不是“\ 0”,但不要担心,我也测试了这个案例,没有改变任何东西。 :/
我甚至没有达到“TEST” - 输出,因为我没有得到新的连接。如果我自己不关闭连接,闪光灯会自动断开连接。
我尝试的最后一件事就是在没有任何请求的情况下发送xml(在建立连接之后就开始了)。我得到了“recv failed” - 错误。
PS:RequestProcessor是我的新线程,在其中我将处理从my.swf-File发送的字符串/命令......
谢谢你的帮助! :)
答案 0 :(得分:0)
之前我遇到过这个问题,你不能只使用in.readLine()来获取策略文件请求字符串,因为字符为零。 要确保您阅读整个策略文件请求:
private String read(BufferedReader in) throws IOException {
StringBuilder builder = new StringBuilder();
int codePoint;
boolean zeroByteRead = false;
System.out.println("Reading...");
do {
codePoint = in.read();
if (codePoint == -1) {
return null;
}
if (codePoint == 0) {
zeroByteRead = true;
} else {
builder.appendCodePoint(codePoint);
}
} while (!zeroByteRead);
return builder.toString();
}
在调用方法中:
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String inputLine;
while ((inputLine = read(in)) != null) {
System.out.println("Receive from client: " + inputLine);
if ("<policy-file-request/>".equals(inputLine)) {
// Serve policy file, like the one in your question.
out.println(buildPolicy() +"\u0000");
} else {
// Do your job.
}
}
您可以找到可以下载的the policy file project in java。我自己也感谢那边的那些人。