problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

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

Resolvido problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Dom 12 Fev 2012, 18:34

asim,eu estou mandando uma menssagem do cliente para o servidor e estou conseguindo,porem quando a menssagem chega no host e o comando que escreve essa variavel em um arquivo txt esta dando problema porque a variavel esta vindo com um caractere nao reconhecido segue abaixo os comandos envouvidos.

a comunicaçao esta sendo feita de 2 projetos diferentes,o projeto host e o projeto cliente

eu estou enviando a variavel global.Nick da seguinte forma

clearbuffer();
writestring(global.Nick);
sendmessage(global.Server);

e usando no host:

nick = readstring()

para ler a variavel nick ke foi enviada pelo cliente
e em seguida usando:

file=file_text_open_write(nick+".txt");
file_text_write_string(file,nick);
file_text_writeln(file)
file_text_close(file);

para criar um arquivo de texto com o jome do cliente ke é a variavel nick
porem o host aponta o seguinte erro :

ERROR in
action number 2
of Alarm Event for alarm 0
for object obj_host:

Error opening file for writing.

--------------

eu fiz um teste e ao inves de colokar nick+".txt"
usei um nome qualquer "testando.txt"

e funcionou,o host gravou o nome que eu colokei na variavel global.nick no cliente
e gravo no arquivo "testando.txt",porem,nao foi só a variavel,outra coisa antes da variavel
tbm foi escrita,um caratere nao reconhecido e que creio eu foi o motivo do erro na hora de dar o nome que estava na variavel ao arquivo txt:

jack

aki em casa esse caratere desconhecido aparece como 1 quadrado com com 3 zeros e 1 quatro,+ ou - asim :

|00|
|04|

abaixo segue todos os objetos dos 2 projetos,cliente e host.

cliente

obj_controle
Spoiler:

Information about object: obj_controle

Sprite:
Solid: false
Visible: true
Depth: 0
Persistent: true
Parent:
Mask:

Create Event:
execute code:

global.Nick = get_string("Digite seu Nick: ",""); //Pegar o nick do jogador
global.Server = 0; //Guarda o Socket do Servidor.
global.MyID = -1; //ID online do jogador
global.MaxPlayers = 0;
dllinit("39dll.dll",1); //Inicializar funções de Sockets da DLL.


Draw Event:
execute code:

if room = room1
{
draw_text(200,16,"Tela de Espera");
}

if instance_exists(obj_cliente)
{
for (i=0; i < global.MaxPlayers; i += 1)
{
draw_text(5,32+i*16, string(i)+" "+obj_cliente.players[i,PL_NICK]);
}
}

if instance_exists(obj_nome){
draw_text(obj_nome.x+4,obj_nome.y+4,global.Nick)}



obj_cliente

Spoiler:

Information about object: obj_cliente

Sprite:
Solid: false
Visible: true
Depth: 0
Persistent: true
Parent:
Mask:

Create Event:
execute code:



global.Server = tcpconnect(global.connectIP,5068,1);

if (!global.Server) //Se não conectarmos sair e exibir mensagem de erro
{instance_destroy();
show_message("Erro ao conectar");
exit;}

room_goto(room1);
alarm[0] = 30


Alarm Event for alarm 0:
execute code:

//Receber mensagens do servidor
var size, msgID;
size = 1;

while (size)
{
size = receivemessage(global.Server); //Retorna a quantidade de bytes recebidos

if (!size) //Se não recebermos nada, sair desse script.
{exit;}

msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja o ID da mensagem.

switch (msgID)
{
case MSG_CONEXAO_ACEITA: //Fui aceito no servidor
global.MyID = readbyte(); //Pegamos o meu ID
global.MaxPlayers = readbyte(); //Lemos a quantidade de jogadores maxima no servidor

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
//players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}
players[global.MyID,PL_NICK] = global.Nick;

//Para dar continuidade agora vamos enviar o meu nick para o servidor
//e ele retornara com o nick de todos os jogadores
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(MSG_CRIAR_CONTA);
writestring(global.Nick);
sendmessage(global.Server);

break;

case MSG_SERVIDOR_CHEIO:
closesocket(global.Servidor); //Fechamos a conexão
show_message("Servidor lotado"); //Exibimos o erro
instance_destroy();
room_goto(rm_Menu); //Voltamos para o menu
exit;
break;
}
}
case MSG_PLDATA:
players[readbyte(), PL_NICK] = readstring();
break;
alarm[0] = 30
//

servidor

obj_controle

Spoiler:

Information about object: obj_controle

Sprite:
Solid: false
Visible: true
Depth: 0
Persistent: true
Parent:
Mask:

Create Event:
execute code:

global.Nick = get_string("Digite seu Nick: ",""); //Pegar o nick do jogador
global.Server = 0; //Guarda o Socket do Servidor.
global.MyID = -1; //ID online do jogador
global.MaxPlayers = 0;
dllinit("39dll.dll",1); //Inicializar funções de Sockets da DLL.


Draw Event:
execute code:

if room = room1
{
draw_text(200,16,"Tela de Espera");
}
if instance_exists(obj_host)
{
for (i=0; i < global.MaxPlayers; i += 1)
{
draw_text(5,32+i*16, string(i)+" Sock: "+string(obj_host.players[i,PL_SOCK])+" Nick: "+obj_host.players[i,PL_NICK]);
}
}

obj_host

Spoiler:

Information about object: obj_host

Sprite:
Solid: false
Visible: true
Depth: 0
Persistent: true
Parent:
Mask:

Create Event:
execute code:

//
//Criar servidor
global.Server = tcplisten(5068,5,1); //Inicializa o Servidor, fica em espera por conexões na porta 5068.
//Você pode mudar os argumentos dessa função como preferir.
//tcplisten(PORTA,CONEXÕES SIMUNTANEAS, MODO);
//PORTA -> Porta para conectar
//CONEXÕES SIMUNTANEAS -> Antes do jogador entrar mesmo no jogo, sua conexão deve ser aceita, enquanto isso ele ficara na "espera".
//Isso é para quantos você quer deixar na espera. Não é preciso um valor muito alto.
//MODO -> deixe o valor em 1, senão seu servidor ficará travado até alguem conectar

if (!global.Server) //Caso não tenha inicializado corretamente passar uma mensagem de erro.
{instance_destroy();
show_message("Erro ao criar o servidor");
exit;}

global.MaxPlayers = 10; //Limite de jogadores

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}

//Adicionar informações do servidor na lista [Servidor sempre é o 0]
players[0,PL_SOCK] = global.Server;
players[0,PL_NICK] = global.Nick;
global.MyID = 0;

room_goto(room1); //Depois de inicializar tudo corretamente ir para a tela de espera.
alarm[0] = 30


Alarm Event for alarm 0:
execute code:

//Aceitar novas conexões
var i, sock, newPL;
sock = tcpaccept(global.Server, 1);
if (!sock) //Se não existirem novas conexões
{exit;} //sair do script

for (i = 0; i < global.MaxPlayers; i+=1)
{
if (!players[i,PL_SOCK])
{
newPL = i;
break;
}
}



if newPL //Tem vagas no servidor
{
players[newPL,PL_SOCK] = sock;
//Enviar uma mensagem para o jogador, falando que ele foi aceito
clearbuffer(); //Limpar o buffer
writebyte(MSG_CONEXAO_ACEITA); //Byte identificador da mensagem
writebyte(newPL); //Enviar o ID do jogador
writebyte(global.MaxPlayers); //Enviar quantidade maxima de jogadores
sendmessage(sock); //Enviar mensagem
}
else //Servidor cheio
{
//Enviar uma mensagem para o jogador, falando que o servidor já está cheio e ele não pode se conectar.
clearbuffer(); //Limpar o buffer
writebyte(MSG_SERVIDOR_CHEIO); //Byte identificador da mensagem
sendmessage(sock); //Enviar mensagem

closesocket(sock);
}

execute code:

//Receber mensagens do Client
var size, msgID;

for (iPL = 1; iPL < global.MaxPlayers; iPL += 1) //Precisamos receber a mensagem de cada jogador
{ //Usamos "iPL" pois depois serão feitos outros loops e usar a variavel "i" pode gerar conflitos
size = 1;
while (size)
{
size = receivemessage(players[iPL,PL_SOCK]); //Receber a mensagem do socket de cada player

if (!size) //Se não recebermos nada, sair desse script e passar para o próximo player
{break;}

msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja o ID da mensagem.



switch (msgID)
{

case MSG_PLDATA: //Pegar dados do jogador
var nick;

nick = readstring(); //Ler o nick do jogador.
login = readstring()

file=file_text_open_write(nick+".txt");
file_text_write_string(file,nick); //Se for uma variável string
file_text_writeln(file)
file_text_close(file);

//Agora guardamos o nick na variavel do jogador:
players[iPL, PL_NICK] = nick;
//Não precisamos guardar o ID porque isso já foi feito quando ele se conectou!

//Agora vamos repassar para os outros jogadores:
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(iPL); //Os outros jogadores só recebem dados do servidor, então precisam saber o ID de qual player são esses dados
writestring(nick);
for (i=1; i < global.MaxPlayers; i+=1) //Como são varios jogadores, precisamos enviar para todos eles
{ //Usando um loop for isso fica bem facil! Repare que começamos do 1, porque o 0 é sempre o servidor.
if (i != iPL) //Não precisamos repassar a mensagem para quem a enviou
{sendmessage(players[i,PL_SOCK]);}
}

//O Hoster possui os dados de todos os jogadores então ele mesmo pode repassar os nicks dos demais players
for (i = 0; i < global.MaxPlayers; i += 1)
{
if (i != iPL) //Não enviar o nick do proprio jogador para ele mesmo
{
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(i);
writestring(players[i,PL_NICK]);
sendmessage(players[iPL,PL_SOCK]);
}
}
break;
}
}
}
alarm[0] = 30


menssagem de erro

ERROR in
action number 2
of Alarm Event for alarm 0
for object obj_host:

Error opening file for writing.







constantes de ambos os projetos

constante | valor

PL_NICK | 1
PL_SOCK | 0
MSG_CONEXAO_ACEITA | 3
MSG_SERVIDOR_CHEIO | 255
MSG_PLDATA | 2

Dez de já agradeço!




Última edição por Daniel Machado Alves em Seg 13 Fev 2012, 14:52, editado 2 vez(es)

Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por PedroX em Dom 12 Fev 2012, 23:36

file=file_text_open_write(nick".txt");
file_text_write_string(file,nick); //Se for uma variável string
file_text_writeln(file)
file_text_close(file);

Você colocou (nick".txt") sem o mais.

Imagino que por você ter colado os códigos aqui, realmente esteja desse jeito no gmk.

Veja ai.

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

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Seg 13 Fev 2012, 00:08

malz erro meu foi na hora de colar no topco pq no gmk eu fui testar se a variavel estava sendo escrita se o nome foce um nome qualquer EX: "testando.txt" e a variavel nick foi escrita só ke com 1 caractere desconhecido antes da variavel

isso aki > 
=/

edit:

quando eu tento criar um arquivo de testo fora do gm,clicando com o direito do mouse>novo>documento de texto e em seguida tento reprodusir o que o codigo tenta fazer,ke é criar um arquivo com a variavel que foi escrita dentro dele EX: jack.txt o Windows aponta o seguinte erro"os nomes de arquivo não podem conter nenhum dos seguintes caracteres: \/ : * ? " <> |"
eu pensso que algun caractere invalido esta sendo inserido na menssagem durante o envio,mas onde isso acontece eu nao faço a menor idéia =/,espero que ajude.

Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Mr.Brum em Seg 13 Fev 2012, 01:49

cara, que tal testar se o arquivo existe , antes de abri-lo??
Pois o erro diz que a falha está ao abrir o arquivo e isso acontece quando ele não é encontrado.
Coloque assim:
Código:
if file_exists(nick+".txt")
{
file=file_text_open_write(nick+".txt");
file_text_write_string(file,nick);
file_text_writeln(file)
file_text_close(file);
}

Pode ser que resolva o problema, mas de qualquer forma, não te aconselho a usar .txt, e sim .ini, que são mais estruturados, e tem funções específicas no gml!

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Seg 13 Fev 2012, 12:04


cara, que tal testar se o arquivo existe , antes de abri-lo??
Pois o erro diz que a falha está ao abrir o arquivo e isso acontece quando ele não é encontrado.
Coloque assim:


if file_exists(nick+".txt")
{
file=file_text_open_write(nick+".txt");
file_text_write_string(file,nick);
file_text_writeln(file)
file_text_close(file);
}
mas eu quero criar um arquivo,o comando
file=file_text_open_write(nick+".txt");
criar um arquivo com o nome nick+".txt" e escreve dentro do arquivo
file_text_write_string(file,nick);
e caso o arquivo ja exista ele abre o arquivo que ele encontrou com o nome dado a ele e grava a variavel nick
file_text_close(file);
e por ultimo fecha o arquivo

eu ja testei esse comando em um teste "offline" e funciono,acontecia exatamento como eu disse,o problema no online é que a variavel esta vindo com uma coisa a + que eu nao colokei nela,um caractere invalido que nao pode ser colocado em um nome de arquivo e por isso aponta o erro,e eu nao faço a menor idéia de onde esse caratere esta sendo inserido na variavel durante o envio de cliente pra servidor =/



Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por MatheusReis em Seg 13 Fev 2012, 12:21

No host, logo após o "nick = readstring() " insira o comando:
Código:
show_message(nick)
E, ao efetuar a conexão normalmente, diga o conteudo da mensagem que aparecerá na tela do host ( deverá ser o nick enviado pelo client E o(s) caractere(s) indesejado(s)).
Assim poderemos descobrir o que está vindo de errado na mensagem, se for o caso.
Faça este teste e poste o resultado.

MatheusReis

Ranking : Nota A
Número de Mensagens : 1087
Idade : 23
Data de inscrição : 13/01/2010
Notas recebidas : B-A-A
Reputação : 30
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 0

http://www.mathaeuz.deviantart.com

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Seg 13 Fev 2012, 12:45



http://imageshack.us/photo/my-images/18/imagendeerro.png/
o caratere que acho ke ta dando problema é esse retangulo antes do nome jack,ke é a variavel que enviei,esse retangulo no bloco de notas aparece como um quadrado e no navegador um simbulo estranho com tres 0 e um 4 formando um quadrado nessa ordem

"0004"
00
04

complicado =/


Última edição por Daniel Machado Alves em Seg 13 Fev 2012, 12:47, editado 1 vez(es)

Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por MatheusReis em Seg 13 Fev 2012, 12:46

Repita o teste com nicks variados, de tamanhos diferentes.
Continua aparecendo SÓ este caractere?

MatheusReis

Ranking : Nota A
Número de Mensagens : 1087
Idade : 23
Data de inscrição : 13/01/2010
Notas recebidas : B-A-A
Reputação : 30
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 0

http://www.mathaeuz.deviantart.com

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Seg 13 Fev 2012, 12:54

aham,sempre aparese esse traço estranho antes,testei nicks com letras maiusculas,com espaços,nick + diferente que testei foi "Daniel Machado Alves"exatamente asim e o traço continua aparecendo =/

edit:
cliente: http://www.mediafire.com/?id3ktuahcwuybdf
servidor: http://www.mediafire.com/?pu9mqjx3tg54ljt

Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por MatheusReis em Seg 13 Fev 2012, 14:01

A minha solução não descobre o por que do caractere aparecer... mas elimina ele antes de usar o nick para criar o arquivo.

Por hora, faça um backup do que tem pronto até agora.
Então, após o "nick=readstring()" use:
Código:
nick=string_delete(nick,1,1);
Isto irá deletar 1 char apartir da posição 1 na string nick (ou seja, vai apagar o primeiro caractere, o indesejado). Assim você poderá usar a nova variável nick para salvar o arquivo. Vou baixar seus editáveis para ver se descubro a causa do caractere.

EDIT

Olha cara... por mais bizarro que seja, o erro vem direto da dll...
Possivelmente este simbolo é residuo de alguma mensagem anterior no buffer. Ou seja, algum dos dados enviados foi lido no formato errado, antes do nick=readstring(), deixando esse caractere para trás. Vou continuar testando.

EDIT 2

Dito e feito!!!

No obj_client você envia o nick constantemente usando a sequencia de dados

byte,byte,string

Código:
writebyte(MSG_PLDATA);
writebyte(MSG_CRIAR_CONTA);
writestring(global.Nick);

Mas no obj_host você só leu 1 byte e 1 string!!!

Primeiro no msgID = readbyte(); e depois no nick=readstring();
O segundo byte enviado no client é adicionado à string no host.

Portanto para corrigir, apenas leia este byte extra antes de ler a string.

Código:
case MSG_PLDATA: //Pegar dados do jogador
var nick;
readbyte()//ignora este byte
nick = readstring();

Com isso, o defeito é sanado e a string do nick será idêntica à enviada pelo client (e poderá ser usada no txt, se o nick enviado nao contiver caracteres especiais).
Você não precisa mais usar aquele code do 'string_delete'. o/

MatheusReis

Ranking : Nota A
Número de Mensagens : 1087
Idade : 23
Data de inscrição : 13/01/2010
Notas recebidas : B-A-A
Reputação : 30
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 0

http://www.mathaeuz.deviantart.com

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Daniel Machado Alves em Seg 13 Fev 2012, 14:51

Problema resolvido ! cheers cheers cheers
Obrigado a todos que dedicaram um tempinho para me ajudar Very Happy

Daniel Machado Alves

Número de Mensagens : 33
Idade : 22
Data de inscrição : 29/04/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: problemas ao escrever uma variavel recebida do cliente em um arquivo .txt 39dll

Mensagem por Conteúdo patrocinado Hoje à(s) 06:05


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