Skip to content

Instantly share code, notes, and snippets.

@mnem
Created April 24, 2013 17:51
Show Gist options
  • Select an option

  • Save mnem/5454080 to your computer and use it in GitHub Desktop.

Select an option

Save mnem/5454080 to your computer and use it in GitHub Desktop.
Simple local TCP line command listener thungumy.
/**
* 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