![]() |
|
||||||||||
|
|
|
|||||
/*
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("<"+__t1+"> "+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. |
|
|||||
|
вчера занялся, переписал старый сокет дли игры на ходу протокол ирки изучал. Сокет очень примитивен но позволяет корректно обрабатывать простые события. В общем для чатанья его вполне достаточно.
Выкладывается скорее в ознакомительных целях, для людей кто хочет сделать что-то подобное но не знает с чего начать.
__________________
I'm only happy when it rains. Waka Laka |
|
|||||
|
Тоже хороший пример - http://dev.etcs.ru/blog/shit/irc_client_as3/ =)
|
|
|||||
|
типа мой умнее и это исключительно сокет, он расправляется с автоматическими запросами и дробит серверные сообщения в удобоваримый вид.
правда вообще без оптимизации, так сказать черновик. добавочное чтиво для тех кого интересует http://www.irchelp.org/irchelp/rfc/rfc.html
__________________
I'm only happy when it rains. Waka Laka Последний раз редактировалось etc; 17.05.2007 в 12:26. |
|
|||||
|
Et cetera
Регистрация: 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|