Sistema cliente-servidor em Python
Outubro 26th, 2008 por Brutto AVT
O que mais vemos por aí são pessoas que desejam criar seu MMORPG com o Blender, mas não sabem nem o que é Python. Foi justamente por isso que escrevi este pequeno artigo demonstrando a criação de um sistema cliente-servidor em Python (presumo que você o possua).
Não vou escrever um tutorial gigante sobre introdução à programação ou ao Python. Se você não sabe programar, pode aprender aqui.
Tendo esse conhecimento básico, é hora de aprender um pouco sobre o módulo socket. Vamos criar um sistema de servidor echo, ou seja, que recebe uma mensagem do cliente e retorna a mesma mensagem como resposta. Aqui vai o script de criação do nosso servidor:
#variável que indica a porta a ser utilizada para transmitir os dados
PORTA = 2021
#variável que indica o IP a ser utilizado para receber conexões
HOST = 'localhost'
#importação do módulo socket
import socket
#variável que recebe um novo socket usando a família INET e tipo de socket STREAM
# família significa um conjunto de características de endereço e protocolo
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#definindo o socket para o ip e porta especificados
s.bind((HOST, PORTA))
#iniciando a aceitação de conexões, neste caso, no máximo uma por vez
s.listen(1)
#mensagem mostrando que o servidor foi iniciado na porta definida
print 'O servidor está rodando na porta ', PORTA
#laço principal infinito
#enquanto 1 (verdadeiro) for verdadeiro, ou seja, sempre
while 1:
#a função accept() retorna um novo socket (con) e seu endereço de origem (end)
con, end = s.accept()
#mensagem mostrando o ip que se conectou ao servidor
print 'conectado a ', end
#a função recv() retorna uma string com os dados recebidos do cliente
#usando um tamanho de buffer de 1024 bytes, equivalente a 1KB de dados
dados = con.recv(1024)
#mensagem mostrando os dados recebidos do cliente
print 'mensagem recebida: ', dados
#envio dos dados recebidos de volta ao cliente
con.send(dados)
#termino da conexão
con.close()
E aqui o código do cliente:
#variável que indica a porta a ser utilizada para transmitir os dados
PORTA = 2021
#variável que indica o IP a ser utilizado para receber conexões
HOST = 'localhost'
#importação do módulo socket
import socket
#variável que recebe um novo socket usando a família INET e tipo de socket STREAM
# família significa um conjunto de características de endereço e protocolo
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#conexão do cliente com o host e porta especificadas
s.connect((HOST, PORTA))
#envio da string 'Teste' ao servidor
s.send('Teste')
#recebimento da resposta do servidor (ver código do servidor)
dados = s.recv(1024)
#término da conexão
s.close
#mensagem mostrando os dados recebidos do servidor
print dados
Para fazer um jogo online com o Blender você pode usar este script como base, definindo melhor o conteúdo dos pacotes que são enviados. Tenha em mente, que todos os clientes precisam ser atualizados simultaneamente, sendo que cada cliente envia seus dados ao servidor e recebe os dados de todos os outros clientes, por exemplo:
Em um jogo de tiro, cada jogador está em uma posição e possui um determinado número de pontos de vida. Quando um jogador se move, suas coordenadas são enviadas ao servidor e retransmitidas a todos os outros clientes, que irão atualizar localmente a posição deste personagem. Quando este mesmo personagem perde alguns pontos de vida, ele envia esse número ao servidor que o retransmite a todos os clientes.
A estrutura básica é essa, assim não corremos o risco de ter nossa vida diminuida de 100 para 10 pontos e ainda sobreviver a um ataque forte de outro jogador.
Para mais informações sobre sockets, visite a documentação oficial: http://www.python.org/doc/2.5.2/lib/socket-objects.html
Postadd em Estudos |
Outubro 26th, 2008 at 15:18
Opa Bruno, estou projetando um jogo e estou pensando em usar php como backend sera que vai ficar muito lentiummmm, pensei nesta solucao para simplificar e ateh porque jah sei php hehehehe.
abs
Outubro 26th, 2008 at 15:18
eita eh Brutto nao bruno foi mal … =)