Arquivado em: AIR, AS 3.0, Flash geral, Flex, Socket, conexao, python | Tags: Actionscript 3, AS 3.0, conexão, python, Socket
Algumas vezes me perguntei como fazer algumas coisas mais complexas em AIR de uma maneira rapida e segura, como por exemplo pegar informaçoes do usuario, conectar com um banco de dados (sem ser o nativo do AIR) como oracle,mssql… executar linha de comando, e outras coisas que só seriam possiveis utilizando alguma outra linguagem mais poderosa. Levando em conta que isto realmente era necessario para aumentar o “poder” do AIR e que o AMF fazia algo parecido, só que para a internet, resolvi criar uma classe em AS e uma função em Python que facilita a comunicação entre os dois (deixe o servidor python rodando de fundo e chame as funçoes dele
)
Primeiro a classe Python.as que pode ser baixada aqui :
package
{
import com.adobe.serialization.json.JSON;
import flash.net.Socket;
/**
* Classe para conexao com python utilizando socket
* @author Armando Leopoldo Keller - (http://alkeller.wordpress.com) - alkeller@live.de
*/
public class Python extends Socket
{
// TODO: Implementar um metodo de retorno, verificando o tipo do retorno, e passando como parametro na funcao associada
/**
* Cria um novo Socket
* @param host Host onde esta o socket
* @param port Porta que esta o socket
* @see flash.net.Socket
* @usage var p:Python = new Python("10.1.1.23",2727);
*/
public function Python(host:String=null, port:uint=0)
{
super(host, port);
host = null;
port = 0;
}
/**
* Chama uma funcao do python se o socket estiver conectado
* @param func Nome da funcao a ser chamada no python
* @param args Argumentos a serem chamados no python
* @usage p.call("teste",{um:1,dois:2,tres:3});
* @usage p.call("teste");
*/
public function call(func:String,args:Object=null):void
{
if(this.connected)
{
this.flush();
var obj:Object = new Object();
obj["funcao"] = func;
for(var i:* in args)
{
if(args[i] is String) args[i] = "'"+args[i]+"'"
obj[i]=args[i];
}
this.writeUTFBytes(JSON.encode(obj));
obj = null;
}
else
throw new Error("Voce deve estar conectado ao socket.")
this.flush();
}
}
}
Depois é necessario a função em python que vai reconhecer o que está sendo chamado pelo flash, o arquivo pode ser baixado aqui :
import json;
def executar(objeto):
__arr__ = [];
__str__ = "";
obj = json.loads(objeto);
__str__ = str(obj["funcao"])+"(";
obj.pop("funcao");
if len(obj.keys()) >= 1:
for k in obj:
__arr__.append(str(k)+"="+str(obj[k]));
for x in xrange(len(__arr__)-1):
__str__ = __str__+__arr__[x]+",";
__str__ = __str__ +__arr__[len(__arr__)-1]+")";
else:
__str__ = __str__+")";
return __str__;
Agora precisamos de um “servidor socket” rodando de fundo com as funçoes a serem chamadas, que pode ser baixado aqui :
import socket
import threading
import json
from JMF import executar
class ClientThread ( threading.Thread ):
def __init__ ( self, channel, details ):
self.channel = channel
self.details = details
threading.Thread.__init__ ( self );
def run ( self ):
print 'Conexao recebida: ', self.details [ 0 ]
self.channel.send ( "resposta vinda do python" )
for x in xrange ( 10 ):
string = self.channel.recv ( 1024 )
self.interpretaComando(string)
self.channel.close();
print 'Conexao fechada: ', self.details [ 0 ]
def interpretaComando(self,string):
eval("self."+executar(str(string)));
def testar(self,arg1,arg2):
print "Chamou testar: "+str(arg1)+","+str(arg2);
self.channel.send("Chamou testar: "+str(arg1)+","+str(arg2));
def pegaVariaveis(self):
print "chamou pegaVariaveis"
self.channel.send("chamou pegaVariaveis");
def pegarArray(self):
print "Chamou pegar Array";
arr = ['a','b','c',1,2,3];
txt = json.dumps(arr);
self.channel.send(txt);
def pegarObj(self):
print "Chamou pegar Objeto";
teste = {}
teste["item1"] = "Primeiro item";
teste["item2"] = "Segundo item";
teste["numero"] = 2;
self.channel.send(json.dumps(teste));
# Inicia o servidor
server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
server.bind ( ( socket.gethostbyname(socket.gethostname()), 2727 ) )
server.listen ( 5 )
print "Iniciando servidor..."
while True:
channel, details = server.accept()
ClientThread ( channel, details).start()
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication applicationComplete="iniciar()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;
private var py:Python
[Bindable]
public var texto:String = ""
public function iniciar():void
{
py = new Python();
py.addEventListener(ProgressEvent.SOCKET_DATA,onRecebe);
py.addEventListener(Event.CONNECT,onConecta);
py.addEventListener(IOErrorEvent.IO_ERROR,onErroIO);
py.connect("10.1.1.3",2727);
}
public function onRecebe(e:ProgressEvent):void
{
var str:String = py.readUTFBytes(py.bytesAvailable);
texto = str;
py.flush();
}
public function onConecta(e:Event):void
{
trace("Conectou")
}
private function chamarTeste():void
{
if(py.connected)
py.call("testar",{arg1:"Argumento 1",arg2:"Argumento 2"})
else
texto = "O socket esta desconectado";
}
private function chamarPegaVariaveis():void
{
if(py.connected)
py.call("pegaVariaveis")
else
texto = "O socket esta desconectado"
}
private function pegarArray():void
{
if(py.connected)
py.call("pegarArray");
else
texto = "O socket esta desconectado";
}
private function pegarObj():void
{
if(py.connected)
py.call("pegarObj");
else
texto = "O socket esta desconectado";
}
private function matarServer():void
{
py.close();
texto = "Desconectado"
}
public function onErroIO(e:IOErrorEvent):void
{
trace("Erro ao conectar com o socket");
}
]]>
</mx:Script>
<mx:VBox>
<mx:HBox>
<mx:Button label = "Testar" click = "chamarTeste()" />
<mx:Button label = "PegaVar" click = "chamarPegaVariaveis()" />
<mx:Button label = "pegarArray" click = "pegarArray()" />
<mx:Button label = "pegarObj" click = "pegarObj()" />
<mx:Button label = "Kill Server" click = "matarServer()" />
</mx:HBox>
<mx:Text text="{texto}" width="100%" height="115"/>
</mx:VBox>
</mx:WindowedApplication>
Claro que esta aplicação ainda está bastante simples, mas o objetivo é demonstrar como pode ser facil conectar o AS3 com Python utilizando socket, para quem não conhece python, vale a pena dar uma estudada, é uma linguagem muito util, poderosa, e simples, que é utilizada em diversos lugares, alguns exemplos bons são nasa e google (precisa mais ? ), agora mistura isso com AS3 (tem algo MUITO funcional e bonito).
Explicação rapida
A sintaxe é muito parecida com a Tweener (classe de tween) que ja é bastante conhecida, então creio que não deve ter muita dificuldade para utilizar esta classe. Sendo que para chamar uma função do python é só chamar instancia.call(“nome_da_funcao”,{nome_do_argumento:valor_do_argumento…….});
Se alguem tiver alguma duvida, ou sugestão para esta classe ou para futuras classes, deixe um comentario ou envie por email mesmo.
A formatação dos codigos ainda não está boa, mas esta melhorando (plugin do Windows Live Writer) se alguem conhecer algum plugin para formatar codigos que tenha suporte a AS, Python, PHP,e C me avisa.
Arquivado em: AIR, AS 3.0, Flash geral, Flex | Tags: banco de dados, classe, exemplo, flash, Flex, SQL, SQLite
Seguindo as sugestões do flavio no post antigo, eu atualizei a classe, agora ela tem eventos e aceita parametros (mais seguro).
OBS: copie e cole os links no seu navegador
link para arquivos da classe: http://paginas.terra.com.br/lazer/alksk8/DB.zip
Fiz tambem um exemplo da utilização da mesma, que agora não é mais global.
link para .as do exemplo : http://paginas.terra.com.br/lazer/alksk8/Main.as
link para o .fla do exemplo: http://paginas.terra.com.br/lazer/alksk8/Main.fla
Eu estou postando com menos frequencia devido a falta de tempo, mas quando sobra tempo estou aqui.
Agora estou envolvido com outro projeto o GOAS3 que tem por objetivo utilizar os serviços disponibilizados pela API do google, isto tambem esta consumindo uma boa parte do meu tempo.
Qualquer duvida , sugestão, ou critica sobre a classe favor fazer por comentario.
Arquivado em: AIR, AS 3.0, Flash geral, Flex, Papervision 3D | Tags: 3d, Actionscript, as3, away 3D, flash, Flex, papervision
Olá, eu estava procurando algumas outras engines 3d para Actionscript, foi então que eu encontrei o Away3D( http://away3d.com/ ) que aparentemente parece ser melhor do que o papervision para coisas mais completas.
Se alguem testar os dois coloque a sua opnião aqui.
eu escolho o Away3D
Arquivado em: AIR, AS 3.0, Flash geral, Flex | Tags: AIR, AS 3, Database, DB, flash, Flex, SQL, SQLite
Neste tutorial mostrarei como utilizar uma classe que eu criei para facilitar o uso de SQL em AIR (tanto para flash quanto para flex)
A classe é esta:
/*
################################################
# #
# Classe : DB (com.alkeller.air.DB) #
# Autor : Armando Leopoldo Keller #
# Versão : 1.0 #
# Contato : alksk8@hotmail.com #
# Blog : http://alkeller.wordpress.com #
# Documentaçao em breve no blog #
# #
################################################
——- Deixe os creditos na classe ———-
*/
package com.alkeller.air
{
// Imports
import flash.data.SQLResult;
import flash.filesystem.File;
import flash.data.SQLStatement;
import flash.data.SQLConnection;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
import flash.errors.SQLError;// Classe;
public class DB
{
// Variaveis utilizadas;
private static var conectado:Boolean = false;
private static var dbFile:File
private static var conn:SQLConnection
private static var _sqlStatement:SQLStatement;
private static var resultado:SQLResult;
private static var retornoString:String;
private static var retornoObjeto:Object;// Funçao Inicia :utilizada para conectar com o banco de dados;
public static function Inicia(_nome:String):String
{
conn = new SQLConnection();
dbFile = File.applicationStorageDirectory.resolvePath(String(_nome+”.db”));
try
{
conn.open(dbFile);
conectado = true;
trace(“Conectado com “+_nome+”.db”);
retornoString = “Conectado com “+_nome+”.db”;
}
catch (error:SQLError) {
conectado = false;
retornoString = “Falha ao conectar: “+error.message+”\nDetalhes: “+error.details;
}
return retornoString;
}
// Funçao executeQuery: Utilizada para executar um comando SQL(verificar quais são aceitos pelo AIR);
// Retorno: SQLResult –> http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/data/SQLResult.html
// ou String de erro;
public static function executeQuery(_sql:String):Object
{
if(conectado == true)
{
_sqlStatement = new SQLStatement();
_sqlStatement.sqlConnection = conn;
_sqlStatement.text = _sql;
try
{
_sqlStatement.execute();
resultado = _sqlStatement.getResult();
retornoObjeto = resultado;
}
catch (error:SQLError)
{
retornoString = “Falha ao executar(“+_sql+”): “+error.message+”\nDetalhes: “+error.details;
}
return retornoObjeto?retornoObjeto:retornoString;
}
else
{
return “Não conectado!”;
}
}
}
}
Classe para download: http://paginas.terra.com.br/lazer/alksk8/DB.as
Como utilizar:
1 – Importe a classe:
// OBS: Aqui é bom verificar se a classe esta no local certo com/alkeller/air/
import com.alkeller.air.*;
// ou
import com.alkeller.air.DB;
2 – Inicie o banco:
DB.Inicia(“teste”); // sendo que teste é o nome do banco
3 – Se as tabelas não existirem, crie elas:
DB.executeQuery(“CREATE TABLE IF NOT EXISTS testando (id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT,sobrenome TEXT)”);
4.1 – Execute as Querys que desejar, por exemplo inserir alguns dados:
DB.executeQuery(“INSERT INTO testando (id,nome,sobrenome) VALUES (null,’ARMANDO LEOPOLDO’,'KELLER’)”);
4.2 – Exemplo de como buscar dados:
var obj:Object = DB.executeQuery(“SELECT * FROM testando”).data;
for(var i:uint=0; i < obj.length; i++)
{
trace(“linha: “+i)
for(var j:Object in obj[i])
{
trace(j+”: “+obj[i][j])
}
}
Aproveitem a classe
Em breve colocarei aqui este tutorial em video.
Olá, fiquei um tempo sem postar devido a falta de tempo , mas estou devolta, para quem ainda não sabe o Adobe AIR não é mais beta, ele ja foi lançado.
player : http://get.adobe.com/air/
Como instalar e começar com AIR + Flash : http://www.adobe.com/devnet/air/flash/getting_started.html
Se alguém tiver duvidas de como instalar ou algo do genero, fala ai que eu vou procurar sanar as duvidas.
Controlar as janelas transparentes do AIR é mais fácil do que parece, aqui vão alguns exemplos de como fazer isso:
Fechar
//tendo um movieClip com instanciado de bt_fechar
bt_fechar.addEventListener(MouseEvent.CLICK,sair);
function sair(e:MouseEvent):void{stage.nativeWindow.close();
}
Minimizar
//tendo um movieClip com instanciado de bt_minimizar
bt_minimizar.addEventListener(MouseEvent.CLICK,minimizar);
function minimizar(e:MouseEvent):void{stage.nativeWindow.minimize();
}
Maximizar
//tendo um movieClip com instanciado de bt_maximizar
bt_maximizar.addEventListener(MouseEvent.CLICK,maximizar);
function minimizar(e:MouseEvent):void{stage.nativeWindow.maximize();
}
Restaurar
//tendo um movieClip com instanciado de bt_restaurar
bt_restaurar.addEventListener(MouseEvent.CLICK,restaurar);
function restaurar(e:MouseEvent):void{stage.nativeWindow.restore();
}
Mover
//Crie um movieClip com a area para ser usada para arrasta, instancie ele como bt_arrastar
bt_arrastar.addEventListener(MouseEvent.MOUSE_DOWN,arrastar);
function arrastar(e:MouseEvent):void{stage.nativeWindow.startMove();
}
Dimensionar
//Crie um movieClip com a area para ser usada para dimensionar, instancie ele como bt_dimensionar
bt_dimensionar.addEventListener(MouseEvent.MOUSE_DOWN,dimensionar);
function dimensionar(e:MouseEvent):void{stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);
}
A formatação do código não está das melhores( tudo feito a mão
), com o tempo quero ver se consigo colocar o plugin de formatação de código aqui, ou encontrar algum que formate sozinho e gere o html com as cores e espaços tudo certos, caso alguém tenha uma sugestão ou duvida, comenta ai.