Jump to content
Sign in to follow this  
Smoon

Jogo multiplayer - que linguagem?

Recommended Posts

Smoon

Olá,

eu comecei a desenvolver um jogo "multiplayer" que é uma variante de xadrez.

O que se passa é que actualmente tenho um servidor que corre em java e um cliente que é um applet de java, e posteriormente quero por um site online no qual se jogue esse jogo.

O meu problema é que os applets em java são muito limitados, especialmente no que diz respeito à comunicação cliente/servidor... pois conforme os browsers utilizados, sistema operativo, etc. em vários casos que experimentei correr os meus programas por browsers obtenho "java security exception blablabla"... Quando corro no netbeans em windows ou linux, mesmo com os clientes e servidores em computadores diferentes funciona tudo bem.

Portanto eu pretendo reescrever o meu código do cliente noutra linguagem... virada para a web, e também pretendo que o meu programa não tenha problemas de permissões devido a firewalls,etc.

Já tenho as mensagens a serem actualmente trocadas no formato XML, então penso que poderia alternativamente usar:

javascript com AJAX

ou

flash actionscript com a classe XMLSocket (que usa sockets TCP).

Portanto peço sugestões, em que me indiquem quais são os prós e contras de cada uma dessas linguagens, e em particular para o caso de um jogo multiplayer qual será a mais adequada, de acordo com factores como desempenho, escalabilidade, ou outros...

Desde já agradeço respostas. :D

nota: eu li o tópico http://www.portugal-a-programar.pt/index.php?showtopic=29214 - "Que linguagem usar?", no entanto achei melhor colocar esta questão em separado, pois este é um caso particular.

Share this post


Link to post
Share on other sites
Maushu

Bem, o que está a dar agora é HTML5 (que é basicamente JavaScript) por isso podes tentar isso.

Em relação á ligação ao servidor, com JavaScript podes podes fazer polling, comet ou websockets (e outros menos comuns).

Polling é basicamente fazer pedidos de AJAX com um determinado intervalo, a pedir actualizações ao servidor e a enviar jogadas. Podes utilizar um servidor de web normal com uma base de dados para isto, por isso em relação ao desempenho e escalabilidade depende da potência do servidor para receber tal número de pedidos por segundo.

Comet é deixar uma ligação ao servidor aberta e utilizar esta para receber e enviar informação, graças ás novas versões dos browsers que nós temos a única vantagem que tem ao polling é a possibilidade de o servidor enviar informação para o cliente a qualquer altura. Polling é geralmente suficiente.

WebSockets é o futuro... que ainda não estamos lá. Poucos browsers suportam este protocolo (neste momento, o Chrome 4+ e o Safari 5+, desactivado no Firefox e Opera por defeito e esquece o IE). Com isto podes enviar e receber mensagens de texto como uma socket de TCP, tens é de ter um servidor web que também suporte isto (ws:// e wss://)

Com o ActionScript (flash), podes também fazer polling ou utilizar o XMLSocket que é semelhante ao WebSocket. A vantagem é que desde que o browser suporta Flash, podes utilizar isto em qualquer sitio. (O iOS não suporta, por isso se fores pelo flash, esquece o iPad e amigos.)

Para utilizar XMLSocket (ou WebSocket, ou o TCPSocket do Java) tens de correr um servidor á parte, mas isso já deves saber tu.

Share this post


Link to post
Share on other sites
Smoon

Hum... então parece-me que não devo usar javascript com polling, pois isso transmite as mensagens de tempos a tempos de um modo determinado (por ex. se escolhesse 1s, penso que poderia não ser suficiente). É que eu quero mantar uma ligação entre o servidor e cada cliente e assim trocar a informação das jogadas de um modo "instantâneo". Logo, pelo que disseste parece-me que poderia fazê-lo com comet... não quero WebSockets, pois vários browsers actuais não o suportam.

Já se usar flash com actionscript é compatível com qualquer browser com flash instalado, mas fico sem compatibilidade com o iPad e semelhantes...

Tenho que ponderar nos vários factores.

Obrigada pela resposta, se alguém tiver mais comentários gostaria de saber.

Share this post


Link to post
Share on other sites
KTachyon

Bem, o que está a dar agora é HTML5 (que é basicamente JavaScript) por isso podes tentar isso.

Só uma correcção: HTML5 e JavaScript são coisas distintas. Podem viver um sem o outro.

Se fizeres um jogo com HTML (4) + JS e AJAX, permites compatibilidade para eventualmente dares o salto para HTML5 quando as coisas estiverem mais estáveis em todos os browsers.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Smoon

Parece-me que estou a ficar mais virada para o javascript com AJAX do que o actionscript (e talvez com HTML4 ou um HTML qualquer).

Estive a pesquisar umas coisas sobre "comet" e pelos vistos esse é um modelo para aplicações web, e não uma linguagem, cujo objectivo coincide com o meu:

– utiliza pedidos HTTP de longa duração (fixe, porque a porta 80 está sempre aberta, logo não terei problemas com firewalls ou coisas do género), permitindo comunicação entre cliente e servidor em "tempo real" através de um browser... :cheesygrin:

Li que um dos exemplos de Comet é a técnica AJAX push, e pesquisando por tal cheguei a um link interessante:

http://www.ape-project.org/

é open souce, tem demos e o que testei funciona mt bem!

Share this post


Link to post
Share on other sites
KTachyon

Tens é que ver se o servidor aguenta a carga que lhe estás a dar, a manteres todas as ligações abertas. Manter ligações abertas come mais recursos, mas evita a latência de teres que voltar a reabrir uma ligação ao servidor.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Smoon

Pois, eu sei disso, manter as ligações abertas tem seus prós e contras, mas eu preciso disso.

E é por isso que eu estava preocupada com o desempenho e a escalabilidade do servidor (que dependo do nº de ligações máximas suportadas).

De qualquer modo, suponho que as ligações do AJAX push por HTTP sejam menos pesadas do que com XMLSockets (TCP) do flash actionscript...

Eles dizem no site http://www.ape-project.org que o servidor APE (sigla para ajax push engine) pode interagir com 100 000 utilizadores simultaneamente, mas também não encontrei a especificação de qual é o hardware correspondente a esse valor.

Share this post


Link to post
Share on other sites
Smoon

Viva!

após ter tentado instalar esse APE-project, desisti pois parece-me que as suas intruções de configuração devem estar incompletas...

Entretanto, andei a procurar algumas coisas sobre comet, e finalmente encontrei um exemplo curto de comet/long polling que funciona com HTML, javascript, AJAX e php, então deixo aqui a minha versão que é bastante baseada em:

http://stackoverflow.com/questions/333664/simple-long-polling-example-code

pois penso que eventualmente possa ser útil para alguém.

É de notar que um servidor real tem que ser completamente diferente deste aqui apresentado como exemplo, mas do lado do cliente o código completo para o envio e recepção de mensagens com long polling para um servidor php é bastante simples:

código do ficheiro "long_poller.html"

<html>
<head>
    <title>welcome to comet!</title>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" charset="utf-8">
    function add_msg(type, msg){
        $("#messages").append(
            "<div class='msg "+ type +"'>"+ msg +"</div>"
        );
    }

    function wait_for_msg(){
        $.ajax({
            type: "GET",
            url: "./msg_server.php",
            async: true, 	/* if set to non-async, browser shows page as "loading..."*/
            cache: false,

            success: function(data){	/* called when request to barge.php completes */
                add_msg("new", data);	/* add response to a .msg div (with the "new" class)*/
                setTimeout(
                    'wait_for_msg()',
                    1000);		/* request next message after 1 second */
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                add_msg("error", textStatus + " (" + errorThrown + ")");
                setTimeout(
                    'wait_for_msg()',
                    1000);		/* try again after 1 second */
            }
        });
    };

    $(document).ready(function(){
        wait_for_msg(); /* start the inital request */
    });
    </script>
</head>
<body>
    <div id="messages">
        <div class="1st msg">
            message requester!
        </div>
    </div>
</body>
</html>

código do ficheiro "msg_server.php"

<?php
if (rand(0, 1)==0){
	/* fake an error */
	header("HTTP/1.0 404 not found");
	die();
}

/* send a string after a random number of seconds (1-10) */
$n=rand(1, 10);
sleep($n);
echo("hi! i have a random number: ".$n);
?>

(*edit* para remover apenas uma vírgula, de modo a ficar compatível também com o IE, portanto actualmente foi verificado que este código corre em versões recentes dos seguintes browsers: firefox, opera, chrome, internet explorer)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.