FLASH 通过URL地址获得服务器数据

1.FLASH 通过URL地址获得服务器数据。

这种方式最为简单,就像在浏览器的地址栏里面敲一样。

先建立一个URLRequest,然后用URLLoader载入就行了。

下面这个是载入一个图片,html页面也用同样方法载入。

Actionscript代码

1.public function Net()

2.{

3.var loader:URLLoader;

4.var request:URLRequest = new URLRequest("https://www.360docs.net/doc/b14087058.html,/d

evnet/images/248x148/fldc_samples_3.jpg");

5.loader = new URLLoader(request);

6.loader.addEventListener(https://www.360docs.net/doc/b14087058.html,PLETE,completeListener);

7.}

8.

9. function completeListener(event:Event):void

10. {

11. trace( "load completed "+loader.data+" are the data

");

12. }

这种方法的缺点显而易见,大量的参数必须写到地址里,数据被暴露而且格式转换麻烦。

2.通过AMF协议来通讯。

AMF协议是ADOBE自己开发的一种建立在HTTP基础上的协议。可以装一个flash mx remoting来实现或者装openAMF来实现,这里只讨论openAMF。先下载一个openAMF,最好带example版本的。然后把openamf.ear放到tomcat的webapps 下,启动tomcat,输入

http://localhost:8080/openamf/gateway

如果看到空白页,说明openAMF好用了。如何用呢?

amf的通信方式是在服务器端把java的class放到web-inf的class中,然后在flash端直接调用这个class的方法就行了。

比如helloworld这个例子。

Actionscript代码

1.package abc;

2.public class HelloServlet

3.{ public String hello() { return "this is java server!"; }

}

用javac编译,把生成的class放到openAMF/classes/abc/

FLASH端这样写:

Actionscript代码

1.用javac编译,把生成的class放到openAMF/classes/abc/

2.FLASH端这样写:

建立一个netconnection,然后连接那个gateway,用call的方法调用java类的方法,格式是包名.类名.方法名。至于返回值,用responder来接收,responder 在接收到数据时会调用fun函数,把返回值写到fun函数的参数里。

3.socket方式通信

这种方法应该可以和任何语言通信,使用TCP/IP协议。但是,对于FLASH PLAYER 9及其以后的版本,比较麻烦的一点就是安全设置,

包括AMF方式在内,如果不设置会出现“安全沙箱”的错误。

FLASH 在连接服务器之前会发一个验证信息:内容如下:

对应的,你也应该发回一个验证信息,XML格式,一般可以这样写:

/>\0

注意!如果把这个串存到字符串里发回去,不要忘记那个\0,XML都是以\0结尾的。

先看FLASH端代码如何写:

Actionscript代码

1. socket = new Socket();

2. socket.addEventListener(ProgressEvent.SOCKET_DATA,receiveDa

ta);

3. socket.addEventListener(Event.CONNECT,begin);

4. socket.connect("127.0.0.1",843);

5.

6.function begin(event:Event):void

7.{

8. var s:String = "a\n";

9. socket.writeByte(s.charCodeAt(0));

10. socket.writeByte(s.charCodeAt(1));

11. socket.flush();

12.}

FLASH端比较简单,先connect,添加CONNECT事件,如果连上了,执行begin 函数,会向服务器写两个byte。

接收的时候用 receivedData函数,函数里面可以这么写:

socket.readBytes(received);

readBytes是把发过来的字符数组存到received里,当然还可以用socket别的方法读取数据。

相对于FLASH端,JAVA服务器端就比较麻烦了。

JAVA服务器这里我们用了多线程,因为可能有很多人访问服务器。先说一下代码思路,main函数里建立一个serversocket,然后不断的接收请求,每收到一个请求,就建立一个进程,把对应的socket放到线程中。另外有一个sender取得所有线程socket的outputstream,实现广播功能。

Java代码

1.public class Main {

2.

3.

4. public static void main(String[] args) throws Exception {

5. ServerSocket ss = new ServerSocket(843);

6. File x;

7. Thread receiver;

8. System.out.println("server start");

9. Sender sender = new Sender();

10. while (true)

11. {

12. Socket socket=null;

13. System.out.println("waiting...");

14. socket = ss.accept();

15. receiver = new Receiver(socket,sender);

16. System.out.println("connect from address: "+socket.

getInetAddress());

17. receiver.start();

18. }

19. //System.out.println("server over");

20. }

21.}

这个是非主线程运行的代码:

Java代码

1.package for_flash_socket;

2.import https://www.360docs.net/doc/b14087058.html,.*;

3.import java.io.*;

4.import java.util.logging.Level;

5.import java.util.logging.Logger;

6.

7.public class Receiver extends Thread {

8.

9. Socket socket;

10. final int BYTE_ARRAY_MAX_LEN = 1000;

11. final String FLASH_SAFE = "";

12. static String safe = "

om domain=\"*\" to-ports=\"*\" />

13.

14.policy>\0";

15. Sender sender;

16. public Receiver(Socket socket,Sender sender )

17. {

18. this.socket = socket;

19. this.sender = sender;

20. }

21.

22. @Override

23. public void run()

24. {

25. try

26. {

27. InputStream is = socket.getInputStream();

28. byte [] reader = new byte [BYTE_ARRAY_MAX_LEN];

29. BufferedWriter bw = new BufferedWriter( new OutputS

treamWriter(socket.getOutputStream()));

30. OutputStream out = socket.getOutputStream();

31. sender.addOutput(out);

32. int ch=0;

33. String s;

34. while ( is.read(reader) != -1 )

35. {

36. //System.out.println("ch - "+ch);

37. s = new String(reader);

38. System.out.println("reader len:"+reader.length)

;

39. System.out.println(s);

40.

41. if ( s!=null && s.indexOf("

/>")>=0 )//安全策略

42. {

43. for ( int i=0;i

44. {

45. System.out.println(i+" "+(int)s.charAt(

i));

46. }

47.

48. bw.write(safe,0,safe.length());

49. bw.flush();

50. //bw.close();

51. System.out.println(safe);

52. }

53. else

54. {

55. synchronized(sender)

56. {

57. sender.send(s);

58. }

59. }

60. reader = new byte [BYTE_ARRAY_MAX_LEN];

61. }

62. bw.close();

63. synchronized (sender)

64. {

65. sender.removeOutput(out);

66. }

67. }

68. catch (Exception ex)

69. {

70. System.out.println("error in receiver");

71. ex.printStackTrace();

72. }

73. try

74. {

75. socket.close();

76. System.out.println(socket.getInetAddress()+" discon

nected");

77. } catch (IOException ex1) {

78. System.out.println("socket close error");

79. Logger.getLogger(Receiver.class.getName()).log(Leve

l.SEVERE, null, ex1);

80. }

81.

82. }

83.}

sender:

Java代码

1.package for_flash_socket;

2.import java.util.*;

3.import java.io.*;

4.public class Sender {

5.

6. ArrayList outputArrayList;

7. public Sender()

8. {

9. outputArrayList = new ArrayList();

10. }

11.

12. public void addOutput(OutputStream out)

13. {

14. outputArrayList.add(out);

15. }

16.

17. public void removeOutput(OutputStream out)

18. {

19. outputArrayList.remove(out);

20. }

21.

22. public void send(String s)

23. {

24. for (int i=0;i

25. {

26. PrintWriter pw = new PrintWriter((OutputStream)outp

utArrayList.get(i));

27. pw.write(s);

28. pw.flush();

29. }

30. }

31.

32.}

线程那个部分代码写得比较搓,明白原理就行了……

这样基本的通信功能就实现了,在接收的时候先判断一下发过来的是不是安全认证s.indexOf("")>=0

如果是返回安全认证,就是那个safe字符串。

否则把发过来的信息广播出去。sender.send方法。

要注意的是:

while ( is.read(reader) != -1 )这一行

我一开始用的是BufferedReader readLine()方法读取的。总是莫名奇妙的出错,所以建议不要用BufferedReader,直接读取byte或者byte数组的方式比较好。再把byte[]转成string判断是否是FLASH发过来的安全认证。

如果出现安全沙箱错误,一般是安全认证没有返回,但是别的情况也有可能出现这个错误,比如服务器的socket关闭早了,或者服务器没有把socket流内的内容读取完毕就关闭了,都会导致这个错误。

所以socket读到不能再读,然后再关闭,这个地方需要注意。

还有一个用XMLSocket的方式通信的,和socket差不多,这里不多说了,安全认证也是一样的,比socket简单一些。

这样,就完成了基本的 FLASH与JAVA 通信。

相关文档
最新文档