package com.natejc.utils.communication
{
import flash.net.XMLSocket;
import flash.events.Event;
import flash.events.IEventDispatcher;
import flash.events.DataEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
// **********************************************************************************
// **********************************************************************************
/**
* Establishes a connection with another application via the XMLSocket class over TCP/IP.
*
* @author Nate Chatellier
*/
public class ConnectionEstablisher
{
// USER DEFINED CONSTANTS
protected static const DEFAULT_IP:String = "127.0.0.1";
protected static const DEFAULT_PORT:int = 5525;
// MEMBER VARIABLES
protected var _xmlSocket:XMLSocket; // the XML Socket server object, used to send & receive messages
protected var _sIPAddress:String; // the IP address where the server is located (TCP/IP)
protected var _nPortNumber:uint; // the port number that the server & client will be using (TCP/IP)
// **********************************************************************************
/**
* Creates a new instance of the ConnectionEstablisher class, configures all applicable
* XMLSocket event listeners, and connects to the specified IP address through the specified port.
*
* @param sIPAddress The IP address of the computer in-which a connection is to be established.
* @param nPortNumber The port number of the application in-which a connection is to be established.
*/
function ConnectionEstablisher(sIPAddress:String = DEFAULT_IP, nPortNumber:int = DEFAULT_PORT)
{
_xmlSocket = new XMLSocket();
configureSocketListeners(_xmlSocket);
establishConnection(sIPAddress, nPortNumber);
} // END CONSTRUCTOR
// **********************************************************************************
/**
* Establishes an XMLSocket connection with the server at sIPAddress over port nPortNumber.
*
* @param sIPAddress The IP address of the computer in-which a connection is to be established (or "" to use the previously assigned IP)
* @param nPortNumber The port number of the application in-which a connection is to be established (or -1 to use the previously assigned port number)
*/
public function establishConnection(sIPAddress:String = "", nPortNumber:int = -1):void
{
if (sIPAddress != "") _sIPAddress = sIPAddress;
if (nPortNumber > 0) _nPortNumber = nPortNumber;
trace("\n\nAttempting to connect to "+_sIPAddress+" on port "+_nPortNumber+"...");
_xmlSocket.connect(_sIPAddress, _nPortNumber);
} // END FUNCTION establishConnection
// **********************************************************************************
/**
* Sends data through the XMLSocket object _xmlSocket.
* Prerequisite: _xmlSocket must have been properly initialized and connected.
*
* @param data The data that should be sent through the XMLSocket.
*/
public function send(data:Object):void
{
try
{
_xmlSocket.send(data);
}
catch(e:Error)
{
trace("*** WARNING in ConnectionEstablisher.send() --> the socket is not currently connected");
} // END TRY
} // END FUNCTION send
// **********************************************************************************
/**
* Initializes all of the event listeners for the IEventDispatcher object (e.g. an XMLSocket object).
*
* @param dispatcher The IEventDispatcher object (e.g. an XMLSocket object) that should listen to the events.
*/
protected function configureSocketListeners(dispatcher:IEventDispatcher):void
{
dispatcher.addEventListener(Event.CLOSE, closeHandler);
dispatcher.addEventListener(Event.CONNECT, connectHandler);
dispatcher.addEventListener(DataEvent.DATA, dataHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
} // END FUNCTION configureSocketListeners
// **********************************************************************************
/**
* Handles the occurence of an Event.CLOSE event generated by the XMLSocket.
*
* @param event The generated Event.CLOSE event.
*/
protected function closeHandler(event:Event):void
{
trace("*** ConnectionEstablisher.closeHandler() -> the socket has been closed: " + event);
} // END FUNCTION closeHandler
// **********************************************************************************
/**
* Handles the occurence of an Event.CONNECT event generated by the XMLSocket.
*
* @param event The generated Event.CONNECT event.
*/
protected function connectHandler(event:Event):void
{
trace("ConnectionEstablisher.connectHandler() -> Successfully connected to "+_sIPAddress+" on port "+_nPortNumber+"\n > "+event+"\n");
} // END FUNCTION connectHandler
// **********************************************************************************
/**
* Handles the occurence of a DataEvent.DATA event generated by the XMLSocket.
*
* @param event The generated DataEvent.DATA event.
*/
protected function dataHandler(event:DataEvent):void
{
trace("ConnectionEstablisher.dataHandler: " + event);
} // END FUNCTION dataHandler
// **********************************************************************************
/**
* Handles the occurence of an IOErrorEvent.IO_ERROR event generated by the XMLSocket.
*
* @param event The generated IOErrorEvent.IO_ERROR event.
*/
protected function ioErrorHandler(event:IOErrorEvent):void
{
trace("ConnectionEstablisher.ioErrorHandler: " + event);
} // END FUNCTION ioErrorHandler
// **********************************************************************************
/**
* Handles the occurence of an ProgressEvent.PROGRESS event generated by the XMLSocket.
*
* @param event The generated ProgressEvent.PROGRESS event.
*/
protected function progressHandler(event:ProgressEvent):void
{
trace("ConnectionEstablisher.progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
} // END FUNCTION progressHandler
// **********************************************************************************
/**
* Handles the occurence of an SecurityErrorEvent.SECURITY_ERROR event generated by the XMLSocket.
*
* @param event The generated SecurityErrorEvent.SECURITY_ERROR event.
*/
protected function securityErrorHandler(event:SecurityErrorEvent):void
{
trace("ConnectionEstablisher.securityErrorHandler: " + event);
} // END FUNCTION securityErrorHandler
// **********************************************************************************
// **********************************************************************************
} // END CLASS ConnectionEstablisher
} // END PACKAGE