socket安全性新问题详解 由于Adobe最近更新了
flashPlayer,
播放器的安全问题改了一些东西,所以用
flash AS2的XMLSocket或者
AS3的Socket都会存在新的问题,本来以前运行好好的程序突然之间就连接不上了,本地测试没问题,放到网上就连接不上了,事实上我就是碰到了这样的问题,才迫使我去找办法解决.
以AS2+java socket为例子说(AS3我没测试过,不过听WiZim说过应该也是如此),flash的写法还是原来的写法,要改的只是服务器端的socket. 只不过连接时候有些不同,首先,flash连接java socket,连接成功后会自动发安全请求到java socket,如果java socket返回正确的安全性文件,则flash 马上断掉这条连接,然后再重新连接java socket,而这次连接则像以前的连接一样,可以正常使用了.而如果返回的是null或者不正确的安全性文件则java,flash都会自动断掉连接,从而造成连接不上的情况.
然后来看这个编译后连接成功的例子,我是参考
http://www.jobems.com/Article_879883.htm里的例子.
String xml = "<cross-domain-policy>";
xml = xml + "<allow-access-from domain=\"*\" to-ports=\"5000,8080\" />";
xml = xml + "</cross-domain-policy>";
ServerSocket serverSocket = new ServerSocket(5000);
while(true)
{
try
{
Socket socket = serverSocket.accept();
System.out.println("连接成功......");
BufferedReader reader= new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter output = new PrintWriter(socket.getOutputStream());
char[] by = new char[22];
reader.read(by,0,22);
String head = new String(by);
System.out.println("消息头:" + head);
if(head.equals("<policy-file-request/>"))
{
System.out.println("安全请求");
output.print(xml + "\0");
output.flush();
} else {
System.out.println("new thread start ------");
ServerThread thread = new ServerThread(socket); thread.start();
}
} catch (Exception e) {
System.out.println("服务器出现异常!" + e );
}
}
上面的xml就是服务器返回给flash的安全文件,告诉flash可以连接这个地址.这里首先获取消息,如果收到安全请求则返回安全文件(这条肯定是最先给服务器的,flash一连接上 socket就会自动发送),得到肯定后,flash,java都断掉这条连接,再重新连接,这时,flash就不会再发送安全请求了,这时socket就可以为它开启线程了 (thread.start();). 这样,假如一flash放在
网页上,连接成功的输出应该是
连接成功......
消息头: <policy-file-request/> 安全请求
连接成功......
而当flash随便发一条信息给socket的时候,则有:
消息头:XXX
new thread start ------
这时,连接正常运行.可查看附件.java刚刚学,有不对的地方希望指出来,别让我错下去
[
本帖最后由 muye 于 2008-4-27 12:45 编辑 ]