Вот, на мой взгляд, уместная реализация синглтона. Почему именно синглтон? - потому, что он общается не напрямую с получателем/отправителем информации, а через менеджер. У менеджера есть еще около 7-8 вариантов получения внешней информации, которая должна выглядеть одинаково для получателей. Т.е. в данном случае я посылаю картинки, но, я могу те же картинки получить не из сокета, а просто загрузив с диска или распарсив информацию получаемую из другого URLStream'a и т.п. получателей информации может быть неопределенное количество, сокет может сменить порт и ИП в процессе работы, но получателя информации это не должно волновать - поэтому менеджер создает его 1 раз и на всегда.
(упрощенный вариант)

Код:
/**
* ...
* @author wvxvw
*/
package phpconnect
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.utils.Endian;
import utilities.LoaderEvent;
import LoadManager;
import App;
import player_internal;
import debug;
public class SocketReceiver extends Socket
{
public static const US_ASCII:String = 'us-ascii';
private var srPort:int;
private var srIP:String;
private var _resourceName:String;
private var _lm:LoadManager;
public function SocketReceiver(i:Initializer)
{
super();
if (i == null) throw new Error("SocketReciever: Argument must not be null!");
endian = Endian.LITTLE_ENDIAN;
addEventListener(Event.CONNECT, dispatchOnConnected);
addEventListener(ProgressEvent.SOCKET_DATA, dispatchOnData);
addEventListener(IOErrorEvent.IO_ERROR, handleIOError);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSecurityError);
}
public function xconnect():void
{
if (!_lm) _lm = App.getInstance().player_internal::_loader;
srPort = _lm.player_internal::getAvailableSocketPort();
srIP = _lm.player_internal::getAvailableSocketIP();
super.connect(srIP, srPort);
}
public function setResourceName(s:String):void
{
_resourceName = s;
}
private function dispatchOnConnected(evt:Event):void
{
dispatchEvent(new LoaderEvent(LoaderEvent.LOADER_CONNECTED, null, LoadManager.DRAW));
}
private function dispatchOnData(evt:ProgressEvent):void
{
if (bytesAvailable == 0) return;
var ba:ByteArray = new ByteArray();
ba.endian = Endian.LITTLE_ENDIAN;
readBytes(ba);
ba.position = 0;
dispatchEvent(new LoaderEvent(LoaderEvent.LOADER_LOADED, ba, LoadManager.DRAW));
}
private function handleIOError(evt:IOErrorEvent):void
{
debug(this, 'IO Error', evt);
}
private function handleSecurityError(evt:SecurityErrorEvent):void
{
debug(this, 'SECURITY Error', evt);
}
public function sendRequest(s:String):void
{
super.writeMultiByte(s, US_ASCII);
super.flush();
}
public function sendBytes(b:ByteArray):void
{
super.writeBytes(b);
super.flush();
}
private static var _instance:SocketReceiver;
public static function getInstance():SocketReceiver
{
if (!_instance) {
_instance = new SocketReceiver(new Initializer());
}
return _instance;
}
}
}
internal final class Initializer
{
public function Initializer(){}
}