Servidor enviar dados ao cliente GM:S Online

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Servidor enviar dados ao cliente GM:S Online

Mensagem por GabrielXavier em Dom 01 Set 2013, 00:59

To tendo dificuldades (realmente nao sei como fazer) para com que o servidor envie dados para os clientes.

Consigo enviar os dados dos clientes para o sevidor mas nao consigo enviar os dados do servidor para os clientes.

To usando o online interno do GM:S

Me basiei neste tutorial: http://gmbr.forumeiros.com/t27638-tutorial-de-multiplayer-networking-nativo-gms

OBS: Não consegui fazer nem com que o servidor ativasse o evento network do cliente.

Please ja faz 12 horas que estou empacado em tentar resolver isso para proseguir com miha intenções e nada de conseguir :'(

GabrielXavier

Ranking : Nota A
Número de Mensagens : 359
Data de inscrição : 25/02/2012
Notas recebidas : A
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 1
   : 1

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por PedroX em Dom 01 Set 2013, 10:01

Código:
Mensagem="Teste";
ServerBuff = buffer_create( 256, buffer_grow, 1)
buffer_seek(ServerBuff,buffer_seek_start,0);
buffer_write(ServerBuff,buffer_string,Mensagem);
network_send_packet(AS_ID,ServerBuff,buffer_tell(ServerBuff));
Esse seria o modelo básico.

Se você reparou, no tutorial o Fred pega o AS_ID assim:
Código:
AS_ID=ds_map_find_value(async_load,"id");
No caso, você só pode enviar mensagens ao recebê-las. Ou seja, você tem que expandir seu jogo. O tutorial mostra o básico. Talvez deva criar uma ds_list (como no tutorial em inglês) e guardar os ids de quem se conecta. Assim você pode fazer um loop pela lista e enviar mensagens para todos os clients. Um ds_map seria até melhor, pois você poderia associar um nome a um id.

Obs: Ainda estou aprendendo sobre o assunto. Talvez possa ser feito de um modo melhor.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por vinians em Dom 01 Set 2013, 11:57

Funciona assim, quando você recebe o evento Networking você tem três tipo de eventos que podem acontecer:

1) Conexao
2) Dados
3) Desconexão

Para se comunicar com o "cliente" você deve armazenar o sockete dele, porém este soquete vem de forma diferente dependendo do evento em questão.
Nos Eventos de Conexão e Desconexão eles estão na chave "socket" no mapa "async_load". Já no evento de "dados"  o soquete esta na chave "id" do mapa "async_load". Está é a grande confusão. Então, BASICAMENTE para responder os eventos você precisa de algo como descrito abaixo:

SERVIDOR BASICO

Evento  CREATE
Código:

server_sock  = network_create_server(network_socket_tcp, 6666, 10); // Armazena o soquete do Servidor.
if (server_sock < 0)
{
    show_message("Erro conectando!");
    game_end();
    exit;
}

// Conexao ok vamos criar o buffer
buffer = buffer_create(256, buffer_grow, 1);
Evento NETWORKING
Código:


type = ds_map_find_value(async_load, "type"); // Tipo de evento

if (type == network_type_connect)
{
    sock_cliente = ds_map_find_value(async_load, "socket"); // Aqui o soquete vem nesta chave

    // Envia um OI pro cliente
    buffer_seek(buffer, buffer_seek_start, 0);            
    buffer_write(buffer, buffer_string, "Oi Cliente!");
    network_send_packet(sock, buffer, buffer_tell(buffer));
}


if (type == network_type_data)
{
    sock = ds_map_find_value(async_load, "id"); // Agora o danado vem no ID...
    if (sock == sock_cliente) // nem precisava pois temos somente um cliente neste teste, mas so pra constar
    {
       buf  = ds_map_find_value(async_load, "buffer"); // Pega o buffer de dados que o CLIENTE enviou
       msg  = buffer_read(buf, buffer_string); // le a mensagem do cliente
       show_message(msg); // mostra a mensagem na tela
    }
}

  
if (type == network_type_disconnect)
{
   show_message("Cliente disconectou!");
}
Evento DESTROY
Código:

// Aqui precisamos liberar os recursos alocados em CREATE
buffer_delete(buffer); // libera o buffer
network_destroy(server_sock); // libera o soquete do server
Não vou fazer a parte do cliente já que sua dúvida é sobre como o servidor envia os dados. Se for de interesse do pessoal, posso fazer um exemplo de chat bem simples pra que todos possam entender, não sei se já tem isso no fórum, mas o legal do chat é que temos vários clientes conectando ao servidor de chats.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por GabrielXavier em Ter 04 Mar 2014, 21:47

Valeew cara suas explicações sanaram minhas duvidas.!
Vlw tbm PedroX!

GabrielXavier

Ranking : Nota A
Número de Mensagens : 359
Data de inscrição : 25/02/2012
Notas recebidas : A
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 1
   : 1

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por fredcobain em Qua 05 Mar 2014, 13:25

Vinians, vc foi exatamente no ponto. Perfeito. Essa diferença é sutil mas gera bastante dúvidas mesmo. Vou até complementar meu tuto com essa observação.

Pra ficar claro:
A comunicação do server com os clients é um pouco diferente pois vc tem que especificar qual client (através do socket).

Existem 2 formas de vc identificar quem é o socket de destino:
1) Quando um client se conecta ao server, é disparado no server o evento ASYNCRONOUS NETWORKING.
Sempre que isso ocorre, o mapa async_load é carregado com informações.
A informação que vc precisa (ID do SOCKET) estará na variável SOCKET desse mapa.

Toda vez que esse evento de conexão ocorrer, vc vai salvar o ID desse client num vetor ou lista... assim vc tem o "endereço" (ou caixa postal, segundo minha fábula) desse client.

2) Sempre que um cliente (já conectado) manda alguma mensagem para o server, o  mapa async_load novamente é carregado com informações.
A informação que vc precisa (ID do SOCKET) estará na variável ID desse mapa. Então vc sabe quem mandou a mensagem.

Ah sim... é claro, existe também uma terceira forma. Que vc pode falar com todo mundo via um comando de broadcast (coisa que não abordei no tuto):



Código:
    buffer_seek(broadcast_buffer, buffer_seek_start, 0);
    buffer_write(broadcast_buffer, buffer_string, global.ServerName);
    network_send_broadcast(server, 6511, broadcast_buffer, buffer_tell(broadcast_buffer));

Mas penso eu que o broadcast só funciona para UDP.

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por ekuhnen em Seg 13 Out 2014, 11:13

Este serviço de broadcast funcionaria bem pra eu informar aos clientes que há um servidor ou vários ativos, atribuindo um nome para cada servidor e dando opção ao cliente de conectar-se no servidor selecionado. confere essa informação ?

ekuhnen

Número de Mensagens : 47
Idade : 33
Data de inscrição : 05/10/2012
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por fredcobain em Seg 13 Out 2014, 11:19

Confere sim. Inclusive na engine de networking da própria Yoyogames (demos) ela faz uso dessa feature pra notificar os servidores disponíveis.

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por ekuhnen em Seg 13 Out 2014, 13:24

Você tem o engine do exemplo da yoyo? to procurando aqui e não encontro, quero olhar essa questão com calma pois a minha ideia é que um mobile execute o server e libere para outras conexões através do hotspot.

ekuhnen

Número de Mensagens : 47
Idade : 33
Data de inscrição : 05/10/2012
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por fredcobain em Seg 13 Out 2014, 13:51

No final dessa página, tem um link para o NetworkDemo.GMZ

http://help.yoyogames.com/entries/25891363-Networking-Overview


fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Servidor enviar dados ao cliente GM:S Online

Mensagem por Conteúdo patrocinado Hoje à(s) 10:29


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum