Exemplo simples de Chat com PHP compartilhado no Google Code.
http://code.google.com/p/flexphpchat/
O principio de funcionamento deste Chat é bem simples. Quando você clica em conectar ele chama o método buscarMensagem(), que é responsável por buscar as mensagens no servidor. No servidor, o pedido quando recebido, primeiramente ele apaga as mensagens com mais de 10s.
mysql_query("DELETE FROM `mensagem` WHERE `CHAT_DATA`+0 < now()-10;");
Por parâmetro é passado o ultimo CHAT_ID que foi carregado na consulta anterior para que só devolva mensagens após este valor. o método busca_fncOk é responsável pelo gerenciamento dos pedidos que chegam do servidor.
private function busca_fncOk(e:ResultEvent):void { // apresneta as mensagens na area // pode vir mais que uma mensagem var retorno:Array = e.result as Array; // somente chama a função se ouve postagem if(retorno != null) { CHAT_ID = retorno[retorno.length-1]['CHAT_ID']; for(var i:int=0; i<retorno.length;i++) { areaMensagem.htmlText += "<b>" + retorno[i]['CHAT_USUARIO'] + ":</b> " + retorno[i]['CHAT_MENSAGEM'] + "<br>"; areaMensagem.validateNow(); areaMensagem.verticalScrollPosition = areaMensagem.maxVerticalScrollPosition; } } buscarMensagem() }
Veja que ele recebe um array, e se este array não for nullo é realizado um loop que varre todo este array atrás de novas mensagens. O método validateNow() é executado para que a execução seja pausado até que o layout do TextArea esteja atualizado para assim posicionar a barra de rolagem na base dele.
Quando esta ação é finalizado, uma nova chamada do método buscarMensagem() é invocado, executando esta busca em loop infinito.
O processo de comunicação é baseado em RemoteObject facilitando assim o trabalho de programação.
Este arquivo é responsável pela configuração do RemoteObject .
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="RemotingMessage"> <channels> <channel ref="my-amfphp"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="RemotingMessage/" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
Veja que em negrito esta destacado o caminho aonde se encontra o amfphp. Você pode alterado a seu critério.
Este é responsável por fazer a comunicação do Flex com o banco de dados. Você poderá sem muito problema implementar este código para qualquer outra linguagem de servidor.
Este amfphp possui algumas alterações que fiz para melhorar seu desempenho e sua segurança. Veja o arquivo original e após as alterações:
Depois das alterações.
Estes arquivos que foram apagados são para sar base ao XMLRPC e ao JSON. Porém como só preciso do AMF, não é necessário ficar armazenando. Renomeei o gateway para index para que a pasta não fique exposta.
PS: quando publicarem não esqueça de apagar a pasta browser.
Na chamada dos métodos, foi adicionado o utf8_decode para evitar problemas com acentuação.
$result = mysql_query(utf8_decode($query));
As configurações do banco de dados estão dentro do arquivo RemotingMessage/globals.php.
define("DB_HOST", "localhost"); // Host do banco de dados define("DB_USER", "chat"); // Usuário do banco de dados define("DB_PASS", ""); // Senha do banco de dados define("DB_NAME", "chat"); // Banco de Dados
O código fonte esta disponível em http://flexphpchat.googlecode.com/files/chat.zip.
http://code.google.com/p/flexphpchat/source/browse/
svn checkout http://flexphpchat.googlecode.com/svn/trunk/ flexphpchat-read-only