Показать сообщение отдельно
Старый 09.07.2008, 13:35
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вот, на мой взгляд, уместная реализация синглтона. Почему именно синглтон? - потому, что он общается не напрямую с получателем/отправителем информации, а через менеджер. У менеджера есть еще около 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(){}
}
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 09.07.2008 в 14:18.