Created
April 24, 2013 17:51
-
-
Save mnem/5454080 to your computer and use it in GitHub Desktop.
Simple local TCP line command listener thungumy.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Copyright | |
| */ | |
| package org.tryharder.levelup2013 | |
| { | |
| import flash.events.Event; | |
| import flash.events.ProgressEvent; | |
| import flash.events.ServerSocketConnectEvent; | |
| import flash.net.ServerSocket; | |
| import flash.net.Socket; | |
| import flash.utils.ByteArray; | |
| public class CommandConnection | |
| { | |
| public function CommandConnection():void | |
| { | |
| addHandler("trace", trace); | |
| } | |
| public function listen(port:int = 12345):void | |
| { | |
| unlisten(); | |
| _server = new ServerSocket(); | |
| _server.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect); | |
| _server.addEventListener(Event.CLOSE, onClose); | |
| _server.bind(port); | |
| _server.listen(); | |
| } | |
| private function onClose(event:Event):void | |
| { | |
| destroySocket(); | |
| } | |
| public function unlisten():void | |
| { | |
| if (_server) | |
| { | |
| _server.removeEventListener(ServerSocketConnectEvent.CONNECT, onConnect); | |
| _server.close(); | |
| _server = null; | |
| } | |
| } | |
| private function onConnect(event:ServerSocketConnectEvent):void | |
| { | |
| destroySocket(); | |
| _socket = event.socket; | |
| _socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); | |
| } | |
| private function destroySocket():void | |
| { | |
| if (_socket) | |
| { | |
| _socket.removeEventListener(ProgressEvent.SOCKET_DATA, onSocketData); | |
| _socket.close(); | |
| _socket = null; | |
| } | |
| _buffer = new ByteArray(); | |
| } | |
| private function onSocketData(event:ProgressEvent):void | |
| { | |
| // Likely a race condition here but I don't care for a demo :) | |
| _buffer.position = _buffer.length; | |
| _socket.readBytes( _buffer, 0, _socket.bytesAvailable); | |
| interpretBuffer(); | |
| } | |
| private function interpretBuffer():void | |
| { | |
| var stringBuffer:String = _buffer.toString(); | |
| var messageStart:int = 0; | |
| var messageEnd:int = stringBuffer.indexOf("\n"); | |
| while(messageEnd != -1) | |
| { | |
| processMessage(stringBuffer.substring(messageStart, messageEnd)); | |
| messageStart = messageEnd + 1; | |
| if (messageStart < stringBuffer.length) | |
| { | |
| messageEnd = stringBuffer.indexOf("\n", messageStart); | |
| } | |
| else | |
| { | |
| messageEnd = -1; | |
| } | |
| } | |
| } | |
| private function processMessage(s:String):void | |
| { | |
| var command:String = getCommand(s); | |
| var data:String = getData(s); | |
| if (_handlers[command]) | |
| { | |
| var handlers:Array = _handlers[command]; | |
| for (var i:int = 0; i < handlers.length; i++) | |
| { | |
| var handler:Function = handlers[i]; | |
| handler(data); | |
| } | |
| } | |
| } | |
| private function getData(s:String):String | |
| { | |
| var dataStart:int = s.indexOf(" ") + 1; | |
| if (dataStart < s.length) | |
| { | |
| return s.substr(dataStart); | |
| } | |
| else | |
| { | |
| return ""; | |
| } | |
| } | |
| private function getCommand(s:String):String | |
| { | |
| return s.split(" ")[0]; | |
| } | |
| public function addHandler(command:String, handler:Function):void | |
| { | |
| var handlers:Array = _handlers[command] || []; | |
| handlers.push(handler); | |
| _handlers[command] = handlers; | |
| } | |
| private var _buffer:ByteArray = new ByteArray(); | |
| private var _server:ServerSocket; | |
| private var _socket:Socket; | |
| private var _handlers:Object = {}; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment