<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ALK               Armando Leopoldo Keller &#187; python</title>
	<atom:link href="http://alkeller.wordpress.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://alkeller.wordpress.com</link>
	<description>Actionscript e  outras coisas</description>
	<lastBuildDate>Fri, 10 Apr 2009 22:42:37 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='alkeller.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/0e7902a612b408f909978db564fa9b98?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>ALK               Armando Leopoldo Keller &#187; python</title>
		<link>http://alkeller.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://alkeller.wordpress.com/osd.xml" title="ALK               Armando Leopoldo Keller" />
		<item>
		<title>Conexão AS3 com python via socket (simplificado)</title>
		<link>http://alkeller.wordpress.com/2009/01/17/conexo-as3-com-python-via-socket-simplificado/</link>
		<comments>http://alkeller.wordpress.com/2009/01/17/conexo-as3-com-python-via-socket-simplificado/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 17:30:41 +0000</pubDate>
		<dc:creator>alksk8</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS 3.0]]></category>
		<category><![CDATA[Flash geral]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[conexao]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Actionscript 3]]></category>
		<category><![CDATA[conexão]]></category>

		<guid isPermaLink="false">http://alkeller.wordpress.com/2009/01/17/conexo-as3-com-python-via-socket-simplificado/</guid>
		<description><![CDATA[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 :D )<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alkeller.wordpress.com&blog=2403732&post=41&subd=alkeller&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>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 <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )</p>
<p>Primeiro a classe Python.as que pode ser baixada <a href="http://cid-cd79b3b43841b5ae.skydrive.live.com/self.aspx/.Public/Python.as">aqui</a> :</p>
<div class="csharpcode">
<pre class="alt">package</pre>
<pre>{</pre>
<pre class="alt">    import com.adobe.serialization.json.JSON;</pre>
<pre class="alt">    import flash.net.Socket;</pre>
<pre class="alt">    <span class="rem">/**</span></pre>
<pre><span class="rem">     * Classe para conexao com python utilizando socket</span></pre>
<pre class="alt"><span class="rem">     * @author    Armando Leopoldo Keller - (http://alkeller.wordpress.com) - alkeller@live.de</span></pre>
<pre><span class="rem">     */</span></pre>
<pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">class</span> Python extends Socket</pre>
<pre>    {</pre>
<pre class="alt">        <span class="rem">// TODO: Implementar um metodo de retorno, verificando o tipo do retorno, e passando como parametro na funcao associada</span></pre>
<pre class="alt">        <span class="rem">/**</span></pre>
<pre><span class="rem">         * Cria um novo Socket</span></pre>
<pre class="alt"><span class="rem">         * @param host    Host onde esta o socket</span></pre>
<pre><span class="rem">         * @param port    Porta que esta o socket</span></pre>
<pre class="alt"><span class="rem">         * @see flash.net.Socket</span></pre>
<pre><span class="rem">         * @usage    var p:Python = new Python("10.1.1.23",2727);</span></pre>
<pre class="alt"><span class="rem">         */</span></pre>
<pre>        <span class="kwrd">public</span> function Python(host:String=<span class="kwrd">null</span>, port:<span class="kwrd">uint</span>=0)</pre>
<pre class="alt">        {</pre>
<pre>            super(host, port);</pre>
<pre class="alt">            host = <span class="kwrd">null</span>;</pre>
<pre>            port = 0;</pre>
<pre class="alt">        }</pre>
<pre class="alt">        <span class="rem">/**</span></pre>
<pre><span class="rem">         * Chama uma funcao do python se o socket estiver conectado </span></pre>
<pre class="alt"><span class="rem">         * @param func    Nome da funcao a ser chamada no python</span></pre>
<pre><span class="rem">         * @param args    Argumentos a serem chamados no python</span></pre>
<pre class="alt"><span class="rem">         * @usage p.call("teste",{um:1,dois:2,tres:3});</span></pre>
<pre><span class="rem">         * @usage p.call("teste");</span></pre>
<pre class="alt"><span class="rem">         */</span></pre>
<pre>        <span class="kwrd">public</span> function call(func:String,args:Object=<span class="kwrd">null</span>):<span class="kwrd">void</span></pre>
<pre class="alt">        {</pre>
<pre>            <span class="kwrd">if</span>(<span class="kwrd">this</span>.connected)</pre>
<pre class="alt">            {</pre>
<pre>                <span class="kwrd">this</span>.flush();</pre>
<pre class="alt">                var obj:Object = <span class="kwrd">new</span> Object();</pre>
<pre>                obj[<span class="str">"funcao"</span>] = func;</pre>
<pre class="alt">                <span class="kwrd">for</span>(var i:* <span class="kwrd">in</span> args)</pre>
<pre>                {</pre>
<pre class="alt">                    <span class="kwrd">if</span>(args[i] <span class="kwrd">is</span> String) args[i] = <span class="str">"'"</span>+args[i]+<span class="str">"'"</span></pre>
<pre>                    obj[i]=args[i];</pre>
<pre class="alt">                }</pre>
<pre>                <span class="kwrd">this</span>.writeUTFBytes(JSON.encode(obj));</pre>
<pre class="alt">                obj = <span class="kwrd">null</span>;</pre>
<pre>            }</pre>
<pre class="alt">            <span class="kwrd">else</span></pre>
<pre>                <span class="kwrd">throw</span> <span class="kwrd">new</span> Error(<span class="str">"Voce deve estar conectado ao socket."</span>)</pre>
<pre class="alt">            <span class="kwrd">this</span>.flush();</pre>
<pre>        }</pre>
<pre class="alt">    }</pre>
<pre>}</pre>
</div>
<p>Depois é necessario a função em python que vai reconhecer o que está sendo chamado pelo flash, o arquivo pode ser baixado <a href="http://cid-cd79b3b43841b5ae.skydrive.live.com/self.aspx/.Public/JMF.py">aqui</a> :</p>
<div class="csharpcode">
<pre class="alt">import json;</pre>
<pre class="alt">def executar(objeto):</pre>
<pre>    __arr__ = [];</pre>
<pre class="alt">    __str__ = <span class="str">""</span>;</pre>
<pre>    obj = json.loads(objeto);</pre>
<pre class="alt">    __str__ = str(obj[<span class="str">"funcao"</span>])+<span class="str">"("</span>;</pre>
<pre>    obj.pop(<span class="str">"funcao"</span>);</pre>
<pre class="alt">    <span class="kwrd">if</span> len(obj.keys()) &gt;= 1:</pre>
<pre>        <span class="kwrd">for</span> k <span class="kwrd">in</span> obj:</pre>
<pre class="alt">            __arr__.append(str(k)+<span class="str">"="</span>+str(obj[k]));</pre>
<pre>        <span class="kwrd">for</span> x <span class="kwrd">in</span> xrange(len(__arr__)-1):</pre>
<pre class="alt">            __str__ = __str__+__arr__[x]+<span class="str">","</span>;</pre>
<pre>        __str__ = __str__ +__arr__[len(__arr__)-1]+<span class="str">")"</span>;</pre>
<pre class="alt">    <span class="kwrd">else</span>:</pre>
<pre>        __str__ = __str__+<span class="str">")"</span>;</pre>
<pre class="alt">    <span class="kwrd">return</span> __str__;</pre>
</div>
<p>Agora precisamos de um “servidor socket” rodando de fundo com as funçoes a serem chamadas, que pode ser baixado <a href="http://cid-cd79b3b43841b5ae.skydrive.live.com/self.aspx/.Public/ServidorPython.py">aqui</a> :</p>
<div class="csharpcode">
<pre class="alt">import socket</pre>
<pre>import threading</pre>
<pre class="alt">import json</pre>
<pre>from JMF import executar</pre>
<pre><span class="kwrd">class</span> ClientThread ( threading.Thread ):</pre>
<pre class="alt">    def __init__ ( self, channel, details ):</pre>
<pre>        self.channel = channel</pre>
<pre class="alt">        self.details = details</pre>
<pre>        threading.Thread.__init__ ( self );</pre>
<pre>    def run ( self ):</pre>
<pre class="alt">        print <span class="rem">'Conexao recebida: ', self.details [ 0 ]</span></pre>
<pre>        self.channel.send ( <span class="str">"resposta vinda do python"</span> )</pre>
<pre class="alt">        <span class="kwrd">for</span> x <span class="kwrd">in</span> xrange ( 10 ):</pre>
<pre>            <span class="kwrd">string</span> = self.channel.recv ( 1024 )</pre>
<pre class="alt">            self.interpretaComando(<span class="kwrd">string</span>)</pre>
<pre>        self.channel.close();</pre>
<pre class="alt">        print <span class="rem">'Conexao fechada: ', self.details [ 0 ]</span></pre>
<pre class="alt">    def interpretaComando(self,<span class="kwrd">string</span>):</pre>
<pre>        eval(<span class="str">"self."</span>+executar(str(<span class="kwrd">string</span>)));</pre>
<pre>    def testar(self,arg1,arg2):</pre>
<pre class="alt">        print <span class="str">"Chamou testar: "</span>+str(arg1)+<span class="str">","</span>+str(arg2);</pre>
<pre>        self.channel.send(<span class="str">"Chamou testar: "</span>+str(arg1)+<span class="str">","</span>+str(arg2));</pre>
<pre>    def pegaVariaveis(self):</pre>
<pre class="alt">        print <span class="str">"chamou pegaVariaveis"</span></pre>
<pre>        self.channel.send(<span class="str">"chamou pegaVariaveis"</span>);</pre>
<pre>    def pegarArray(self):</pre>
<pre class="alt">        print <span class="str">"Chamou pegar Array"</span>;</pre>
<pre>        arr = [<span class="rem">'a','b','c',1,2,3];</span></pre>
<pre class="alt">        txt = json.dumps(arr);</pre>
<pre>        self.channel.send(txt);</pre>
<pre>    def pegarObj(self):</pre>
<pre class="alt">        print <span class="str">"Chamou pegar Objeto"</span>;</pre>
<pre>        teste = {}</pre>
<pre class="alt">        teste[<span class="str">"item1"</span>]   =   <span class="str">"Primeiro item"</span>;</pre>
<pre>        teste[<span class="str">"item2"</span>]   =   <span class="str">"Segundo item"</span>;</pre>
<pre class="alt">        teste[<span class="str">"numero"</span>]  =   2;</pre>
<pre>        self.channel.send(json.dumps(teste));</pre>
<pre># Inicia o servidor</pre>
<pre class="alt">server = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )</pre>
<pre>server.bind ( ( socket.gethostbyname(socket.gethostname()), 2727 ) )</pre>
<pre class="alt">server.listen ( 5 )</pre>
<pre class="alt">print <span class="str">"Iniciando servidor..."</span></pre>
<pre class="alt"><span class="kwrd">while</span> <span class="kwrd">True</span>:</pre>
<pre>    channel, details = server.accept()</pre>
<pre class="alt">    ClientThread ( channel, details).start()</pre>
</div>
<div class="csharpcode">Pronto, agora só falta uma aplicação de exemplo chamando estas funçoes, que pode ser baixada <a href="http://cid-cd79b3b43841b5ae.skydrive.live.com/self.aspx/.Public/PyFlex.mxml">aqui</a> :</div>
<div class="csharpcode">
<pre class="alt">&lt;?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span>?&gt;</pre>
<pre>&lt;mx:WindowedApplication applicationComplete=<span class="str">"iniciar()"</span> xmlns:mx=<span class="str">"http://www.adobe.com/2006/mxml"</span> layout=<span class="str">"absolute"</span>&gt;</pre>
<pre class="alt">    &lt;mx:Script&gt;</pre>
<pre>        &lt;![CDATA[</pre>
<pre>            import com.adobe.serialization.json.JSON;</pre>
<pre>            <span class="kwrd">private</span> var py:Python</pre>
<pre>            [Bindable]</pre>
<pre class="alt">            <span class="kwrd">public</span> var texto:String = <span class="str">""</span></pre>
<pre class="alt">            <span class="kwrd">public</span> function iniciar():<span class="kwrd">void</span></pre>
<pre>            {</pre>
<pre class="alt">                py = <span class="kwrd">new</span> Python();</pre>
<pre>                py.addEventListener(ProgressEvent.SOCKET_DATA,onRecebe);</pre>
<pre class="alt">                py.addEventListener(Event.CONNECT,onConecta);</pre>
<pre>                py.addEventListener(IOErrorEvent.IO_ERROR,onErroIO);</pre>
<pre class="alt">                py.connect(<span class="str">"10.1.1.3"</span>,2727);</pre>
<pre>            }</pre>
<pre>            <span class="kwrd">public</span> function onRecebe(e:ProgressEvent):<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                var str:String = py.readUTFBytes(py.bytesAvailable);</pre>
<pre class="alt">                texto = str;</pre>
<pre>                py.flush();</pre>
<pre class="alt">            }</pre>
<pre class="alt">            <span class="kwrd">public</span> function onConecta(e:Event):<span class="kwrd">void</span></pre>
<pre>            {</pre>
<pre class="alt">                trace(<span class="str">"Conectou"</span>)</pre>
<pre>            }</pre>
<pre>            <span class="kwrd">private</span> function chamarTeste():<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                <span class="kwrd">if</span>(py.connected)</pre>
<pre class="alt">                    py.call(<span class="str">"testar"</span>,{arg1:<span class="str">"Argumento 1"</span>,arg2:<span class="str">"Argumento 2"</span>})</pre>
<pre>                <span class="kwrd">else</span></pre>
<pre class="alt">                    texto = <span class="str">"O socket esta desconectado"</span>;</pre>
<pre>            }</pre>
<pre>            <span class="kwrd">private</span> function chamarPegaVariaveis():<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                <span class="kwrd">if</span>(py.connected)</pre>
<pre class="alt">                    py.call(<span class="str">"pegaVariaveis"</span>)</pre>
<pre>                <span class="kwrd">else</span></pre>
<pre class="alt">                    texto = <span class="str">"O socket esta desconectado"</span></pre>
<pre>            }</pre>
<pre>            <span class="kwrd">private</span> function pegarArray():<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                <span class="kwrd">if</span>(py.connected)</pre>
<pre class="alt">                    py.call(<span class="str">"pegarArray"</span>);</pre>
<pre>                <span class="kwrd">else</span></pre>
<pre class="alt">                    texto = <span class="str">"O socket esta desconectado"</span>;</pre>
<pre>            }</pre>
<pre>            <span class="kwrd">private</span> function pegarObj():<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                <span class="kwrd">if</span>(py.connected)</pre>
<pre class="alt">                    py.call(<span class="str">"pegarObj"</span>);</pre>
<pre>                <span class="kwrd">else</span></pre>
<pre class="alt">                    texto = <span class="str">"O socket esta desconectado"</span>;</pre>
<pre>            }</pre>
<pre>            <span class="kwrd">private</span> function matarServer():<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                py.close();</pre>
<pre class="alt">                texto = <span class="str">"Desconectado"</span></pre>
<pre>            }</pre>
<pre>            <span class="kwrd">public</span> function onErroIO(e:IOErrorEvent):<span class="kwrd">void</span></pre>
<pre class="alt">            {</pre>
<pre>                trace(<span class="str">"Erro ao conectar com o socket"</span>);</pre>
<pre class="alt">            }</pre>
<pre class="alt">        ]]&gt;</pre>
<pre>    &lt;/mx:Script&gt;</pre>
<pre class="alt">    &lt;mx:VBox&gt;</pre>
<pre>        &lt;mx:HBox&gt;</pre>
<pre class="alt">            &lt;mx:Button label = <span class="str">"Testar"</span>         click = <span class="str">"chamarTeste()"</span>            /&gt;</pre>
<pre>            &lt;mx:Button label = <span class="str">"PegaVar"</span>         click = <span class="str">"chamarPegaVariaveis()"</span>    /&gt;</pre>
<pre class="alt">            &lt;mx:Button label = <span class="str">"pegarArray"</span>     click = <span class="str">"pegarArray()"</span>            /&gt;</pre>
<pre>            &lt;mx:Button label = <span class="str">"pegarObj"</span>         click = <span class="str">"pegarObj()"</span>            /&gt;</pre>
<pre class="alt">            &lt;mx:Button label = <span class="str">"Kill Server"</span>    click = <span class="str">"matarServer()"</span>            /&gt;</pre>
<pre>        &lt;/mx:HBox&gt;</pre>
<pre class="alt">        &lt;mx:Text text=<span class="str">"{texto}"</span> width=<span class="str">"100%"</span> height=<span class="str">"115"</span>/&gt;</pre>
<pre>    &lt;/mx:VBox&gt;</pre>
<pre class="alt">&lt;/mx:WindowedApplication&gt;</pre>
</div>
<p>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).</p>
<p><strong>Explicação rapida</strong></p>
<p>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…….});</p>
<p>Se alguem tiver alguma duvida, ou sugestão para esta classe ou para futuras classes, deixe um comentario ou envie por email mesmo.</p>
<p>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.</p>
Posted in AIR, AS 3.0, conexao, Flash geral, Flex, python, Socket  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alkeller.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alkeller.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alkeller.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alkeller.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alkeller.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alkeller.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alkeller.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alkeller.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alkeller.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alkeller.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alkeller.wordpress.com&blog=2403732&post=41&subd=alkeller&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alkeller.wordpress.com/2009/01/17/conexo-as3-com-python-via-socket-simplificado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/92cf4f8bd8ab85b9a50c99c1c7b0716b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">alksk8</media:title>
		</media:content>
	</item>
	</channel>
</rss>