Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.05.2007, 05:25
Usnul вне форума Посмотреть профиль Отправить личное сообщение для Usnul Посетить домашнюю страницу Usnul Найти все сообщения от Usnul
  № 1  
Ответить с цитированием
Usnul
 
Аватар для Usnul

Регистрация: Mar 2001
Адрес: во сне
Сообщений: 2,701
Отправить сообщение для Usnul с помощью ICQ
По умолчанию Умный сокет для IRC

Код:
/*
	This is an extension of the existing Socket class, the main two differences are:
	
		1)	Accumulative buffer to allow operating more than one packet at a time and also
			to reduce the lag by allowing large packets of data to be sent in smaller chunks.
			
		2)	Packet parser and packet dispatcher - this feature parses the buffer taking all known
			packets out of the chain, processing the data out of those packets and dispatching
			that packet in an "easy-to-use" format.
	
	Note:
		-	Because of the strict protocol introduced in this system, there is practically no way to
			parse the chain after it has been desrupted. Because of this you don't have a luxery of
			making mistakes.
*/
/*
a MOD of Connection class from MMORPG project v0.73 major difference is in the protocol structure, so most of the
data processing had to be re-writen
*/
package net
{
	import flash.net.Socket;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.errors.IOError;
	import flash.events.SecurityErrorEvent;
	import flash.events.ProgressEvent;
	
	public class Connection extends Socket
	{

		public var buffer:String = new String;
		//public var log:Array = new Array;
		private var _eng:engine;

		public function Connection(eng:engine, host:String="",port:int=0){
			_eng = eng;
			
			if(host.length>0 && port>0){
				super(host, port);
			}
			
			//Adding listeners
			addEventListener(Event.CONNECT, connectHandler);
			addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
		}
		
		private function ioErrorHandler(event:IOErrorEvent):void {
			//trace("ioErrorHandler: " + event);
			trace("Socket has been closed due to operation timeout.");
		}
		private function connectHandler(event:Event):void {
			//trace("connectHandler: " + event);
			trace("Connection with server has beed successfully established.");
			if(this.connected){
				logon();
			}
		}
		private function securityErrorHandler(event:SecurityErrorEvent):void {
			trace("securityErrorHandler: " + event);
		}
	
	    private function socketDataHandler(event:ProgressEvent):void {
			var str:String = readUTFBytes(this.bytesAvailable);
			buffer += String(str);
	        parseBuffer();
	    }
	    private function parseBuffer():void{
	    	if(buffer.length>=0){
	    		var __t1:String;
	    		var arr:Array = buffer.split("\n");
	    		for(var i:int=0; i<arr.length; i++){
	    			var str:String = arr[i].slice(0,arr[i].length-1);
	    			
	    			if(str.length>0){
	    				trace("SERVER MSG: "+str);
	    				
	    				var shost:String = new String;
	    				var cmdAt:int = 0;
	    				if(str.charAt(0)==":"){
	    					shost = str.slice(1,str.indexOf(" "));
	    					cmdAt = shost.length+2;
	    				}
	    				var cmd:String = str.slice(cmdAt,str.indexOf(":",1)-1);
	    				
	    				var msg:String = str.slice(str.indexOf(":",1)+1,str.length);
	    				var code:int = str.split(" ",2)[1];
	    				//trace("CODE: "+code+"<");
	    				//trace("CMD: "+cmd+"<");
	    				switch(code){
	    					case 001:
	    						sendRequest("JOIN "+_eng.cChannel);
	    						//_eng.logTF.text="";
	    						break;
	    					case 353: //names list
	    						_eng.chanUsers = _eng.chanUsers.concat(msg.split(" "));
	    						_eng.rCUList();
	    						break;
	    					default:
	    						break;
	    				}
	    				switch(cmd){
	    					/*case "NOTICE AUTH":
	    						_eng.addToLog("<font color='#0000FF'>"+msg+"</font>");
	    						trace("'"+cmd+"','"+msg+"'");
	    						if(msg=="*** Found your hostname"){
	    							//logon();
	    							//this.addEventListener(ProgressEvent.SOCKET_DATA,__setMode);
	    							//function __setMode(evt:ProgressEvent):void{
	    							//	sendRequest("MODE "+_eng.nick+" +x");
	    							//}
	    						}
	    						break;*/
	    					/*case "NOTICE "+_eng.nick:
	    						_eng.addToLog("<font color='#0000FF'>"+msg+"</font>");
	    						break;*/
	    					case "QUIT":
	    						__t1 = str.slice(1,str.indexOf("!"));
	    						_eng.addToLog(__t1+" quits ("+msg+")");
	    						_eng.removeNick(__t1);
	    						break;
	    					case "PART":
	    						__t1 = str.slice(1,str.indexOf("!"));
	    						_eng.addToLog(__t1+" leaves the channel ("+msg+")");
	    						_eng.removeNick(__t1);
	    						break;
	    					case "NICK":
	    						__t1 = str.slice(1,str.indexOf("!"));
	    						_eng.changeNick(__t1,msg);
	    						_eng.addToLog(__t1+" is now known as "+msg);
	    						break;
	    					case "JOIN":
	    						__t1 = str.slice(1,str.indexOf("!"));
	    						if(__t1==_eng.nick){
	    							//trace("It's your freaking nick.");
	    						}
	    						else{
		    						_eng.addToLog(__t1+" joined the channel");
		    						_eng.addNick(__t1);
	    						}
	    						break;
	    					case "PING":
	    						//_eng.addToLog("Ping? Pong!");
	    						sendRequest("PONG "+msg);
	    						break;
	    					case String("PRIVMSG "+_eng.cChannel):
	    						__t1 = str.slice(1,str.indexOf("!"));
	    						_eng.addToLog("&lt;"+__t1+"&gt; "+msg);
	    						break;
	    					default:
	    						_eng.addToLog(msg);
	    						//trace("***ERROR: UNKNOWN COMMAND");
	    						break;
	    				}
	    				//log.push(str); //Storing the processed string into the log
	    			}
	    		}
	    		buffer = "";
	    	}
	    }
	    public function stdConnect():void{
	    	connect("newyork.ny.us.undernet.org",6667);
	    }
		public function sendRequest(str:String):void{
			trace("	->"+str)
			writeUTFBytes(str+"\n");
			flush();
		}
		public function logon(evt:Event=null):void{
			trace("TRYING TO LOG IN");
			sendRequest("NICK "+_eng.nick);
			sendRequest("USER Guest \"hostaddress\" \"someservername\" :John Smith");
		}
	}
}
__________________
I'm only happy when it rains.
Waka Laka


Последний раз редактировалось Usnul; 17.05.2007 в 05:29.
Старый 17.05.2007, 05:28
Usnul вне форума Посмотреть профиль Отправить личное сообщение для Usnul Посетить домашнюю страницу Usnul Найти все сообщения от Usnul
  № 2  
Ответить с цитированием
Usnul
 
Аватар для Usnul

Регистрация: Mar 2001
Адрес: во сне
Сообщений: 2,701
Отправить сообщение для Usnul с помощью ICQ
вчера занялся, переписал старый сокет дли игры на ходу протокол ирки изучал. Сокет очень примитивен но позволяет корректно обрабатывать простые события. В общем для чатанья его вполне достаточно.

Выкладывается скорее в ознакомительных целях, для людей кто хочет сделать что-то подобное но не знает с чего начать.
__________________
I'm only happy when it rains.
Waka Laka

Старый 17.05.2007, 05:31
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 3  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
Тоже хороший пример - http://dev.etcs.ru/blog/shit/irc_client_as3/ =)
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 17.05.2007, 05:36
Usnul вне форума Посмотреть профиль Отправить личное сообщение для Usnul Посетить домашнюю страницу Usnul Найти все сообщения от Usnul
  № 4  
Ответить с цитированием
Usnul
 
Аватар для Usnul

Регистрация: Mar 2001
Адрес: во сне
Сообщений: 2,701
Отправить сообщение для Usnul с помощью ICQ
типа мой умнее и это исключительно сокет, он расправляется с автоматическими запросами и дробит серверные сообщения в удобоваримый вид.
правда вообще без оптимизации, так сказать черновик.

добавочное чтиво для тех кого интересует
http://www.irchelp.org/irchelp/rfc/rfc.html
__________________
I'm only happy when it rains.
Waka Laka


Последний раз редактировалось etc; 17.05.2007 в 12:26.
Старый 17.05.2007, 12:24
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Типа у меня есть продвинутый вариант
Только там не один класс, но сам проект фасадный.

В основном классе пишем строки типа:

Код:
			this.irc = new IRC('irc1','irc.dion.ru',6667);
			this.irc.encoding = 'windows-1251';
			this.irc.autoPong = true;
			this.irc.addEventListener(SocketEvent.CONNECT,this.connectHandler);
			this.irc.addEventListener(ServerEvent.RPL_NAMREPLY,this.nickListHandler);
			this.irc.addEventListener(ServerEvent.RPL_ENDOFNAMES,this.nickListEndHandler);
			this.irc.addEventListener(ServerEvent.RPL_TOPIC,this.topicHandler);
			this.irc.addEventListener(UserEvent.PRIVMSG,this.messageHandler);
			this.irc.connect();
…

		private function connectHandler(event:SocketEvent):void {
			this.irc.queueCommands = true;
			this.irc.setUser('flashirc','FlashIRC');
			this.irc.setNick('FlashIRC');
			this.irc.joinChannel('#flasher');
			this.irc.flushCommands();
		}
И вуаля

Не дописан. Если есть желание поковыряться с этим — велкам!


Последний раз редактировалось etc; 17.05.2007 в 12:27.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.