Flex amf3通訊協議實例
服務端:
import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import flex.messaging.io.SerializationContext; import flex.messaging.io.amf.Amf3Input; import flex.messaging.io.amf.Amf3Output; public class AmfServer { public static void main(String args[]) { SerializationContext serializationContext=new SerializationContext(); //序列化amf3對象 Amf3Output amfout=new Amf3Output(serializationContext); //實現了一個輸出流,其中的數據被寫入一個 byte 數組。 ByteArrayOutputStream byteoutStream=new ByteArrayOutputStream(); //將byteoutStream產生的數組流導入到DataOutputStream流中 DataOutputStream dataoutstream=new DataOutputStream(byteoutStream); //創建ServerSocket和Socket對象 ServerSocket serverSocekt; Socket socket; // 設置流的編碼格式為amf3 amfout.setOutputStream(dataoutstream); //創建Map對象、Double對象數組 HashMap map=new HashMap(); map.put("Event", "人物移動"); map.put("user", "閃刀浪子"); map.put("x", 100); map.put("y", 100); try { amfout.writeObject(map);//實際上是將map對象寫入到dataoutstream流中 dataoutstream.flush();//清空緩存 } catch (IOException e) { e.printStackTrace(); } //將ByteArrayOutputStream流中轉化成字節數組 byte[] messageBytes=byteoutStream.toByteArray();//amf3數據 OutputStreamWriter osw;//使用amf3格式將寫入流中的數據編碼成字節 BufferedWriter bwrite;//用來封裝OutputStreamWriter,以提高效率 try { System.out.println("輸出數組長度"+messageBytes.length); serverSocekt=new ServerSocket(1028);//開啟服務器進程 System.out.println("服務器已經啟動。。。。。。。"); socket=serverSocekt.accept(); if(socket.isConnected()) { System.out.println(">>>>>>>>>>客戶端已連接"); } //socket. osw=new OutputStreamWriter(socket.getOutputStream());//將字符流轉化為字節流 bwrite=new BufferedWriter(osw);//封裝osw對象,提高寫入的效率 socket.getOutputStream().write(messageBytes);//向流中寫入二進制數據 socket.getOutputStream().flush(); socket.getOutputStream().close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 客戶端: var socket:Socket=new Socket(); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); socket.connect("localhost",1028); var obj:Object=new Object(); addEventListener("recieved",recievedData); function recievedData(evt:Event) { switch (obj.Event) { case "人物移動" : trace("把玩家:"+obj.user+" 移動到"+obj.x+","+obj.y); break; case "人物換裝" : trace("人物換裝"); break; case "消息廣播" : trace("系統信息"); break; default : break; } }; function closeHandler(event:Event):void { trace("連接關閉"); } function connectHandler(event:Event):void { trace("連接成功"); } function ioErrorHandler(event:IOErrorEvent):void { trace("ioErrorHandler信息: " + event); } function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler信息: " + event); } function socketDataHandler(event:ProgressEvent):void { trace("接收數據"); obj=socket.readObject(); this.dispatchEvent(new Event("recieved")); } 壓縮的AMF數據通訊協議 服務端: 上篇文章介紹和如何在java中將數據封裝成flash可以直接讀取的amf格式,amf雖然已經“壓縮”過了(相對其他xml、json等,由于基于二進制而且比較少冗余數據,體積會小很多)。 但是還可以進一步壓縮的,由于as3的bytearray支持compress和uncompress。所以我們可以在Java端將數據壓縮,然后在flash端讀取再解壓縮,這樣數據在傳輸過程中又會小很多。 下面就介紹使用方法,基于前篇文章的范例: 服務端: import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import flex.messaging.io.SerializationContext; import flex.messaging.io.amf.Amf3Output; import flex.messaging.log.Log; import flex.messaging.messages.Message; public class Test { /** * @param args */ public static void main(String[] args) { SerializationContext serializationContext=new SerializationContext(); Amf3Output amfOut = new Amf3Output(serializationContext); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); DataOutputStream dataOutStream = new DataOutputStream(outStream); amfOut.setOutputStream(dataOutStream); HashMap<String, Object> map=new HashMap<String, Object>(); Double[] arr=new Double[10000]; for(int index=0;index<10000;index++) { arr[index]=Math.random(); } map.put("arr", arr); map.put("name", "weni"); map.put("age", "27"); try { amfOut.writeObject(map); dataOutStream.flush(); } catch (IOException e) { e.printStackTrace(); } byte[] messageBytes = outStream.toByteArray(); try { FileOutputStream os; OutputStreamWriter ow; BufferedWriter out; os = new FileOutputStream("D://test.txt"); ow = new OutputStreamWriter(os); out = new BufferedWriter(ow); os.write(messageBytes); os.flush(); os.close(); messageBytes=compressBytes(messageBytes); //將數據進行壓縮 System.out.println("OK"); }catch(Exception e) { System.out.println("error :" + e); } } private static int cachesize = 1024; private static Inflater decompresser = new Inflater(); private static Deflater compresser = new Deflater(); public static byte[] compressBytes(byte input[]) { compresser.reset(); compresser.setInput(input); compresser.finish(); byte output[] = new byte[0]; ByteArrayOutputStream o = new ByteArrayOutputStream(input.length); try { byte[] buf = new byte[cachesize]; int got; while (!compresser.finished()) { got = compresser.deflate(buf); o.write(buf, 0, got); } output = o.toByteArray(); } finally { try { o.close(); } catch (IOException e) { e.printStackTrace(); } } return output; } public static byte[] decompressBytes(byte input[]) { byte output[] = new byte[0]; decompresser.reset(); decompresser.setInput(input); ByteArrayOutputStream o = new ByteArrayOutputStream(input.length); try { byte[] buf = new byte[cachesize]; int got; while (!decompresser.finished()) { got = decompresser.inflate(buf); o.write(buf, 0, got); } output = o.toByteArray(); }catch(Exception e) { e.printStackTrace(); }finally { try { o.close(); } catch (IOException e) { e.printStackTrace(); } } return output; } } 客戶端: public class AMF3Test extends Sprite { private var loader:URLLoader; public function AMF3Test() { loader=new URLLoader(); loader.load(new URLRequest("D://test5.txt")); loader.addEventListener(Event.COMPLETE,onComplete); loader.dataFormat=URLLoaderDataFormat.BINARY; } private function onComplete(evt:Event):void { var start:Number=getTimer(); var byte:ByteArray=loader.data as ByteArray; byte.uncompress() //將數據進行解壓縮 var obj:Object=byte.readObject(); var end:Number=getTimer(); trace("耗時:"+(end-start)+"毫秒") trace(obj.name,obj.age,obj.arr.length) } }
本文由用戶 arthurcsh 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!