java与flash通信.docx_第1页
java与flash通信.docx_第2页
java与flash通信.docx_第3页
java与flash通信.docx_第4页
java与flash通信.docx_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

众所周知Flash的功能比较强大,但是有两个功能到目前为止始终无法实现 是swf的点对点连接 是swf读写操作文件 别想了,靠Flash本身是不可能的,虽然有传说中的MMSave();等一些隐藏函数,但是毕竟这些未公开的函数了解的人并不多,用起来也不方便。 那么究竟有没有其他办法可以扶助实现呢?答案当然是肯定的。在这里我们需要请出当前最热的两门名副其实的编程语言C+/Java,靠他们来实现你要实现的功能吧。 在这里我用Java举例。首先我们必须了解AS如何让Java做事?对于双方来讲唯一应用性最高的途径就是Socket了。 AS1-XMLSocket-send()-Java.Socket-InputStream AS2-XMLSocket-send()-Java.Socket-InputStream AS3-Socket-writh()-flush()-Java.Socket-InputStream as1&2只支持以字符串形式发送socket,而as3支持真正意义上的流,在这里为了兼容和教学简单,我均以字符串形式来实现相互间的通信。1-AS与Java最基本的通信 1.1简单Java服务器 首先我们来做最简单的单线程Java服务器 importjava.io.*; .*; publicclassServerextendsServerSocket /服务端口号常量(as要求必须大于1024,小于65535) privatestaticfinalintSERVER_PORT=10086; /申明流的空间 privateSocketclient; privateBufferedReaderin; privatePrintWriterout; privateStringsrc; /构造函数 publicServer()throwsIOException super(SERVER_PORT); /监听连接,初始流在进来后读取前,和写入后发送前所存放的空间 Socketsocket=accept(); in=newBufferedReader(newInputStreamReader(client.getInputStream(); out=newPrintWriter(client.getOutputStream(),true); /循环等待读取信息 while(true) /读取行信息,注意是以换行符结束的 src=in.readLine(); /如果发送close,就跳出循环(断开连接) if(src.equals(close) break; /在收到的信息前加是标识并发回(注意结尾加0,这是as的XMLSocket读入每条信息的条件.as3的Socket不需要) out.println(rev:+src+0); /以上out.println(xx)相当于out.write(xx);out.flush();的执行效果 System.out.println(msgis+src) /关闭连接 close(); /入口函数. publicstaticvoidmain(Stringargs)throwsIOException newServer(); 这样一个Java的服务器就建好了,Java是同步的事件的驱动是等待的,这个AS是不同的,所以方法对与as区别还是比较大的,具体功能已经注释的非常清楚。至于具体Java的特性我不是专业的,为了对读者负责我就不做详细介绍了,有兴趣的朋友可以查阅Java相关书籍。 接下来呢就是AS的访问了:1.4AS3与Java通信 ActionScript3 最后是传说中的as3了,这里我们用Socket中的writeUTFBytes();来写字符串。首先来看fla版的 varSERVER_PORT:Number=10086; varSERVER_IP:String=; varconn:Socket=newSocket(SERVER_IP,SERVER_PORT); conn.addEventListener(connect,socketConnect); conn.addEventListener(socketData,socketData); functionsocketConnect(event:Event) event.target.writeUTFBytes(helloworld); event.target.writeByte(10); event.target.flush(); functionsocketData(event:ProgressEvent) trace(event.target.readUTFBytes(event.target.bytesAvailable); 看看这个fla版本的是不是在代码上思路更加清晰呢?所有事件已经全部改为监听的方式,并且所有事件将把事件作为参数传入函数。 bytesAvailable为字节长度,而readUTFBytes的参数是从当前指向的位置读取到参数位置,这样写就是读完。 在as2里,如果在事件触发的函数里写this指向的是触发事件的实例,而as3永远指向所在类的实力,触发事件的实例被记录在传入事件参数的target对象中。 as3更加注重的是oop,在fla里已经体现出来了。接下来就来看看DocmentClass的方法 packageclassRun privatevarSERVER_PORT:Number=10086; privatevarSERVER_IP:String=; publicfunctionRun() /在这里写代码并在flash里设置该类为文档类,和直接写上帧上其实没有区别,入口函数 newClientSocket(SERVER_IP,SERVER_PORT); 当然还有一个ClientSocket.as的文件放这个socket客户端类 package .Socket; importflash.events.ProgressEvent; importflash.events.Event; importflash.events.IOErrorEvent; publicclassClientSocketextendsSocket publicfunctionClientSocket(ip:String,port:uint) super(ip,port); addEventListener(cennect,socketConnect); addEventListener(socketData,socketData); addEventListener(ioError,ioError); publicfunctionsend(src:String) writeUTFBytes(src); writeByte(10); flush(); privatefunctionsocketConnect(event:Event) send(helloworld); privatefunctionsocketData(event:ProgressEvent) trace(readUTFBytes(bytesAvailable); privatefunctionioError(event:IOErrorEvent) trace(connecterror); 入口函数创建了一个客户端的对象,而具体的类的内部构造如上代码所示: 首先创建父类构造函数,再为自己添加监听,当连接时执行socketConnect();发送字符串,注意writeByte(10)是换行符。 在as3的socket类里还有其他的事件,这里因为教学原因所以没有过多的举例,相关可以查阅socket的帮助 close在服务器关闭套接字连接时调度。 connect在建立网络连接后调度。(这个监听在教程里已经实现) deactivateFlashPlayer失去操作系统焦点并变为非活动状态时调度。 ioError在出现输入/输出错误并导致发送或加载操作失败时调度。(以前是在onConnect传入false,而这里是直接引发ioError事件,更规范) securityError若对Socket.connect()的调用尝试连接到调用方安全沙箱外部的服务器或端口号低于1024的端口,则进行调度。 socketData在套接字接收到数据后调度。(这个监听在教程里已经实现)Java多线程服务器 基本的通信做到以后就是修改代码增加功能了,这里我们必须让Java能支持多个线程的连接,这才是服务器呀。 importjava.io.*; .*; publicclassServerextendsServerSocket /服务端口号常量(as要求必须大于1024,小于65535) privatestaticfinalintSERVER_PORT=10086; /构造函数 publicServer()throwsIOException super(SERVER_PORT); /监听新连接,为每个连接分配一个线程,将新的连接传入独立线程 Socketsocket=accept(); newSocketThread(socket); /入口函数. publicstaticvoidmain(Stringargs)throwsIOException newServer(); /建一个类,该类属于独立的线程,他的每个实例都会在独立的线程里运行 classSocketThreadextendsThread /申明流的空间在独立线程里了,因为他属于传送时所需,主线程只是监听有没有新连接 privateSocketclient; privateBufferedReaderin; privatePrintWriterout; privateStringsrc; /构造函数 publicSocketThread(Socketsocket)throwsIOException /初始客户端的连接为该线程传入的连接 client=socket; /初始流在进来后读取前,和写入后发送前所存放的空间 in=newBufferedReader(newInputStreamReader(client.getInputStream(); out=newPrintWriter(client.getOutputStream(),true); /准备工作完毕,启动该线程 start(); publicvoidrun()try /循环等待读取信息 while(true) /读取行信息,注意是以换行符结束的 src=in.readLine(); /如果发送close,就跳出循环(断开连接) if(src.equals(close) break; /在收到的信息前加是标识并发回(注意结尾加0,这是as的XMLSocket读入每条信息的条件.as3的Socket不需要) out.println(rev:+src+0); /以上out.println(xx)相当于out.write(xx);out.flush();的执行效果 System.out.println(msgis+src) /关闭连接 close(); catch(IOExceptione) catch(NullPointerExceptione) Sys

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论