大家好,我是奶綠茶
今天來介紹一下 Adobe AIR ServerSocket
需求:
很多台電腦,在同一個區網,要能彼此溝通,同時 Android 平版也要能傳接值。
解:
本來想如果就只有單 flash 的話, 可以使用 P2P 區網連線就決解了,
但因為 Andriod 平版也要能支援, 所以就改成 Socket 來溝通。
那為什麼不用 Java 架 Socket Server 就好了,因為我是閃客(因為用 Java 做動畫會死人)
AIR 端,使用ServerSocket 類別。
在畫面上就只放所有連線的 Client 列表,一個發送訊息的文字和Button, 一個接收的文字
在用 flash 寫一個 Client 端測試:
Java/Android 端
使用 Socket 類別
因為程式碼落落長,
有需要的朋友就直接下載 Android 端的程式碼,在這就不貼出來了
AIR
Java/Android
轉載請註明出處
今天來介紹一下 Adobe AIR ServerSocket
需求:
很多台電腦,在同一個區網,要能彼此溝通,同時 Android 平版也要能傳接值。
解:
本來想如果就只有單 flash 的話, 可以使用 P2P 區網連線就決解了,
但因為 Andriod 平版也要能支援, 所以就改成 Socket 來溝通。
那為什麼不用 Java 架 Socket Server 就好了,因為我是閃客(因為用 Java 做動畫會死人)
AIR 端,使用ServerSocket 類別。
在畫面上就只放所有連線的 Client 列表,一個發送訊息的文字和Button, 一個接收的文字
<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="createComplete(event);" close="appCloseHandler()"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Script> <![CDATA[ import flash.display.NativeWindow; import flash.events.Event; import flash.events.ProgressEvent; import flash.events.ServerSocketConnectEvent; import flash.net.ServerSocket; import flash.net.Socket; import flash.utils.ByteArray; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.events.FlexEvent; private var server :ServerSocket = new ServerSocket(); [Bindable] private var serverActivity:Boolean = false; [Bindable] private var clientSockets:ArrayCollection = new ArrayCollection(); //private var ipAddress :String = "192.168.253.176"; private var ipAddress :String = "127.0.0.1"; private var ipAddressPort :int = 9527; private function createComplete(e:FlexEvent):void { try { server.bind(ipAddressPort, ipAddress); log( "bind:" + ipAddress+":"+ipAddressPort ); server.addEventListener(ServerSocketConnectEvent.CONNECT , clientConnectedHandler); server.listen(); serverActivity = true; }catch (err:Error){ log( err + "" ); serverActivity = false; Alert.show(err.message); } } private function clientConnectedHandler(e:ServerSocketConnectEvent):void { //每當有新的 Client 連該進來, 就會觸發該函式。 var clientSocket:Socket = e.socket; log( clientSocket.localAddress + ":" + clientSocket.localPort ); clientSockets.addItem( clientSocket ); clientSocket.addEventListener(Event.CLOSE , clientDisconnectedHandler); //偵聽當 Client 離線時。 clientSocket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketData ); //偵聽 Client 發出的訊息 } private function onClientSocketData(e:ProgressEvent):void { // 讀取 Client 發出的訊息 var buffer:ByteArray = new ByteArray(); var clientSocket:Socket = e.currentTarget as Socket; clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable ); log( "Received: " + buffer.toString() ); } private function clientDisconnectedHandler(e:Event):void { // 當 Client 離線時。 e.currentTarget.removeEventListener( e.type , arguments.callee ); clientSockets.removeItemAt( clientSockets.getItemIndex(e.target)); } private function log(o:Object):void { textArea.text += o +"\n"; } private function writeDataToSockets(e:Event):void { var msg:String = textInput.text; if (msg == "") { return; } trace( "ServerSocketMain.writeDataToSockets "); // 對所有的 Client 發出訊息。 for each (var socket:Socket in clientSockets) { if (socket.connected) { try { socket.writeUTF(msg); socket.flush(); }catch (err:Error){ log(err); } } } } private function appCloseHandler():void { server.close(); server = null; } ]]> </fx:Script> <s:HGroup width="100%" height="100%" paddingLeft="5"> <s:List width="200" height="100%" dataProvider="{clientSockets}" labelField="localAddress"></s:List> <s:VGroup width="100%" height="100%"> <s:HGroup width="600"> <s:TextInput id="textInput" width="200" text="server send info to all client" /> <s:Button x="130" y="10" label="Send" click="writeDataToSockets(event)" enabled="{textInput.text.length>0}" visible="{clientSockets.length>0}" /> </s:HGroup> <s:Button label="clear" click="{textArea.text=''}" enabled="{serverActivity}"/> <s:TextArea id="textArea" width="200" height="100%" editable="false" /> </s:VGroup> </s:HGroup> </s:WindowedApplication>
在用 flash 寫一個 Client 端測試:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" creationComplete="createSocket(event)"> <s:layout> <s:VerticalLayout /> </s:layout> <fx:Script> <![CDATA[ import flash.events.Event; import flash.events.ProgressEvent; import flash.net.Socket; import mx.events.FlexEvent; protected var socket:Socket; private var ipAddress :String = "127.0.0.1"; private var ipAddressPort :int = 9527; protected function createSocket(event:FlexEvent):void { socket = new Socket(); socket.addEventListener(Event.CONNECT,socketConnected); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketData); socket.connect( ipAddress, ipAddressPort ); } protected function socketConnected(e:Event):void{ log("client - socket connected"); } protected function socketData(e:ProgressEvent):void{ trace("client - socket data"); //trace(socket.readUTF()); log(socket.readUTF()); } private function callServerClickHandler():void { try { socket.writeUTF("callServer"); socket.flush(); }catch (err:Error){ log(err); } } private function log(o:Object):void { textArea.text += o + "\n"; } ]]> </fx:Script> <s:Button label="call Server" click="callServerClickHandler()" /> <s:TextArea id="textArea"></s:TextArea> </s:Application>
Java/Android 端
使用 Socket 類別
因為程式碼落落長,
有需要的朋友就直接下載 Android 端的程式碼,在這就不貼出來了
AIR
Java/Android
轉載請註明出處
留言
代理ARToolkit的擴增實境公司於12月3日舉辦手機版擴增實境ARToolkit for iOS一日通課程,請詳官網http://www.ar-truth.com/cover-page/news
※ 課程目標:
1.瞭解擴增實境 (AR) 市場規模及國際趨勢
2.讓從來沒用過ARToolkit 的人,從一開始的步驟開始教學,到可以運用在
iPhone上的AR,用iPhone偵測marker叫出動畫,完成一項實際案例。
一般 C+ Server or java server
是做一樣的工作嗎 ? 還是...
效能會較差呢 ?
因為我沒有壓力測試過 AIR 的 Server
所以不清楚效能的部份