Italian B4J - Websocket server + client b4a - chiaritemi le idee !!!

LucaMs

Expert
Licensed User
Longtime User
Bene, sono a una svolta (si capisce già dal fatto che non ho scritto "ad una svolta", senza la d. Perché scrivo questo? Per farvi capire a che livello sia arrivata la mia pazzia :confused::confused::confused::p).

A parte il fatto che sono bloccato su un microscopico bug (anzi, forse macroscopico, nel senso che so esattamente quale sia il problema ma mi viene l'orticaria ogni volta che mi avvicino al progetto per correggerlo)...

A parte il fatto che potrei fregarmene, FORSE, dell'ultimo dubbio che sta bloccando davvero tutto, riguardo ai possibili ritardi di ricezione dati da parte dei client (parlo sempre del mio ormai antico progetto-gioco client-server), del quale ho chiesto un parere nel forum "internazionale" senza davvero risolvere... Qui trovate tutto il thread

ora devo decidere se proseguire ed arrivare finalmente a qualcosa di giocabile, fregandome appunto dei "ritardi" (mah!), oppure riscrivere tutto meglio e adottando un metodo un po' "costoso", nel senso che richiede un minimissimo traffico dati in più tra client e server (usare RunFunctionWithResult anziché RunFunction; entrambe consentono al server di lanciare routine sul client, ma la prima attende un risultato. Questo risultato potrebbe essere, nel mio caso, un semplice segnale di "comando ricevuto", ma poi che fare se questa "ricevuta" non arriva al server?).

Non so se:

a) proseguire fregandomene di eventuali ritardi ed occuparmene eventualmente una volta completata buona parte del progetto (ovvero messo in pratica almeno parte del gioco vero e proprio sul client);

b) ristrutturare tutto, usando quel RunFunctionWithResult e magari usando una specie di protocollo per lo scambio di "comandi", sia server che client

c) chiedere a qualcuno di voi se abbia tempo e voglia di collaborare per sviluppare insieme una base di questo tipo (strutturare bene una sorta di messaggistica client-server che possa essere utile per giochi a turni online). (HHUUHH ?)

d) buttare tutto, software e pure hardware e pregare UN Dio che mi faccia fare ALMENO una cinquina al Lotto :p


Fatemi sapere presto, per favore, che... "l'estate sta finendo"... e non me ne frega niente, perché non me la godo più da secoli!


[chiamate il 118, presto :confused:]
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
io opterei per il punto (a), anche se, tutto sommato, anche il punto (d) ha i suoi lati positivi :D

Sergio
 

LucaMs

Expert
Licensed User
Longtime User
Come non esiste più? Da quando?

Cmq, puoi sempre pagarmi uno psichiatra privato :confused::p
 

LucaMs

Expert
Licensed User
Longtime User
Last edited:

LordZenzo

Well-Known Member
Licensed User
Longtime User
Ah, quindi ora esiste solo (o comunque tanto vale chiamare direttamente) quel 112 (che, se non sbaglio, un tempo era il numero per i Carabinieri)?
e già, cosi si attiva una catena del soccorso, chiami loro, e loro decidono chi chiamare
un passaggio in più, che magari ti mette in coda, e parli con gente che neanche capisce quello che dici
prima chiamavi il 118 e rispondeva un infermiere, chiamavi il 112 e rispondeva un carabiniere, chiamavi il 115 e rispondeva un pompiere
ora chiami e risponde un rumeno che al massimo conosce totti (senza offesa per lui)

Nota che quel testo lo ha scritto un infermiere :)
siamo magici:D:D:D:)


mi sa che siamo andati ot...
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
mi sa che siamo andati ot...
Appena appena... ma tanto sono solo in questo mare e... sto affogando... e nemmeno chiamo il 112, tanto ho capito, prima che arrivino i soccorsi avrò raggiunto le Bahamas :p
 

nonno

Active Member
Licensed User
...almeno tu ti stai scervellando per qualcosa di serio, io per due cavolate che nemmeno quelle funzionano:mad:
 
D

Deleted member 103

Guest
a) proseguire fregandomene di eventuali ritardi ed occuparmene eventualmente una volta completata buona parte del progetto (ovvero messo in pratica almeno parte del gioco vero e proprio sul client);
questo sarebbe anche il mio consiglio, tanto i Bug vengono sempre dopo. ;)
Il gioco si può perfezionare solo quando verrà usato da molti clienti.
 

LucaMs

Expert
Licensed User
Longtime User
questo sarebbe anche il mio consiglio, tanto i Bug vengono sempre dopo. ;)
Il gioco si può perfezionare solo quando verrà usato da molti clienti.

Certo, in genere si sviluppa un sw e poi qualche bug spunta fuori per forza, soprattutto se il sw contiene molto codice.

Ma qui il punto è che questo sw dovrebbe servire come base per poi poter crearre giochi diversi ed è cruciale la comunicazione tra server e client.

Se ad un certo punto la connessione tra client e server cade (per "colpa" del client) questa situazione si può gestire, in qualche modo, perché sul server si scatena l'evento Disconnected dell'oggetto websocket ed il server sa che non è una disconessione volontaria dell'utente perché questa viene notificata dal client al server.

E' invece un grosso problema il fatto che magari un client, proprio il dispositivo fisico, ha una connessione lenta e riceve dati in ritardo; non c'è un evento automatico che informi il server che tutti i dati che ha trasmesso siano arrivati al client. Per questo, io "vedo" solo due soluzioni:

a) ad ogni comando inviato dal server, il client deve inviare un comando di "ricevuto"
b) usare, per lanciare il comando dal client al server, RunFunctionWithResult anziché RunFunction; questa fa in modo che il server rimanga in attesa della ricezione del comando da parte del client.

Comunque, è un bel casino, detto semplicemente :).


Grazie Filippo
 

IlCasti

Active Member
Licensed User
Longtime User
Ciao Luca,

tornando al discorso di ieri ipotizzo un normale flusso di gioco. :rolleyes:

Io e te ci sfidiamo ad un gioco a turni.

Il server crea la stanza per la partita. Poniamo il caso che randomicamente ne crei un tot in funzione dei client collegati

(“fa” brutto farla creare all'utente e poi lasciarlo a se stesso lì dentro senza poter far nulla se non incrociare le dita affinché qualcuno arrivi :D)

Clicchiamo su gioca e la partita inizia.

Tutte le mosse che fa ogni client vengono postate verso il server che le reindirizza solo al/ai client che non hanno mosso perché non era il loro turno e le mosse nello stesso tempo vengono salvate su un database locale.

Il client risponde con un “ok” da 2 byte e poi lo stesso client a questo punto fa il resto, animazioni aggiorna punti etc etc..

Gli altri client nel frattempo possono fare solo le mosse consentite.

Dopo 10 turni, Tonino, che è "sfortunello" (ha la wind e va in 2g o_O) perde la connessione.

In automatico il server cerca di rintracciarlo, ma Panariello non vuole :mad: e solo dopo molti secondi ci riesce.

Nel frattempo il server ha giocato le scelte migliori/random per lui e non appena il client riesce gli fa sapere a che punto era, così il server gli manda solo le ultime mosse.

Riallinea il gioco che continua il suo loop sino alla fine.

La stessa cosa può valere per le altre info che vorresti mandare, come chat, oggetti, etc etc

Se non dovesse farcela a riconnettersi, un giorno quando avrà almeno il 3g vedrà il risultato della partita che ha perso con handicap :)


Scusa se mi sono ripetuto su cose già dette, ma almeno ho un punto di partenza per proseguire la discussione. ;)
 

LucaMs

Expert
Licensed User
Longtime User
Scusa se mi sono ripetuto su cose già dette, ma almeno ho un punto di partenza per proseguire la discussione. ;)
Va benissimo e, anzi, ti ringrazio, perché discuterne mi aiuterà a trovare la soluzione migliore (spero :))

Il server crea la stanza per la partita. Poniamo il caso che randomicamente ne crei un tot in funzione dei client collegati
(“fa” brutto farla creare all'utente e poi lasciarlo a se stesso lì dentro senza poter far nulla se non incrociare le dita affinché qualcuno arrivi :D)
Infatti ho dovuto affrontare anche questo problema; soprattutto quando il gioco sarà appena pubblicato, non ci saranno certo molti utenti. Così, oltre a creare un numero minimo di stanze, numero che sarà sempre disponibile, anche quando una stanza sarà stata occupata e sarà in gioco, ci saranno dei bot; questi bot saranno volutamente e dichiaratamente stupidi, altrimenti gli avversari umani smetteranno di giocare ;)
I bot serviranno a fare compagnia agli umani, quando ce ne siano pochi, ed entreranno nelle stanze solo dopo tot tempo durante il quale non entrino umani.

Adesso provo a commentare (e capire, oggi il mal di capa... grrrr) ciò che hai scritto però anticipo subito che il problema non riguarda soltanto le fasi di gioco vero e proprio, cioè non soltanto le "mosse" dei giocatori e le loro conseguenze, in quanto, durante il gioco, mentre un giocatore è di turno ed ha un timer (20 sec - timer tra l'altro sul server, non sul client) che gli dà il tempo di fare la propria mossa, gli altri giocatori dovranno poter fare altro, come ad esempio inviare oggetti (immagini) agli altri (ad esempio un giocatore offre il caffè a tutti gli altri oppure chiede l'amicizia ad un altro). Anche queste informazioni saranno scambiate tra client e server e tra server e clientS ed anche in questi casi potrebbero esserci client con connessione lenta.

Ah, prima ancora... Informatix aveva risposto: ma perché non usi Google Play Game Services? Al limite, puoi studiare come funziona.
Ha poi concordato che usare quei servizi ti rende poi dipendente da essi (e dalle modifiche che potrebbe apportarvi); il punto è che io non ho letto niente riguardo gli eventuali ritardi di connessione!


[salto il commento alla parte precedente perché non sono sicuro di aver capito esattamente come la intendi]
Dopo 10 turni, Tonino, che è "sfortunello" (ha la wind e va in 2g o_O) perde la connessione.
Non parlo di connessione perduta, ovvero di disconnessione, ma di connessioni lente. La grande differenza è che il server si accorge subito se una connessione è stata chiusa (tramite l'evento Disconnected dell'oggetto websocket "legato" al client) e se è stata chiusa volontariamente (riceve questa info dal client) oppure se è caduta.
In questo caso, disconnessione, ho una soluzione accettabile: il server, scaduti i 20 sec, effettua una mossa casuale ma legalmente valida al posto del giocatore ed il gioco poi prosegue normalmente, passando il turno.
I problemi nascono quando un client con connessione lenta, il quale è stato è stato "momentaneamene sostituito dal server", riceve poi tutte insieme le comunicazioni accodate, accumulate mentre il suo dispositivo non era in grado di riceverle.

Inoltre, mentre l'oggetto websocket che fa da canale di comunicazione client <---> server segnala connessione-disconnessione, non segnala certo ritardi né tantomeno consente di eliminare messaggi dalla coda (anzi, non si parla proprio di code, nella varia documentazione).

Io credo che dovrò studiare bene, inventare, una specie di "protocollo" di comunicazione, cioè la struttura dei messaggi dovrà avere una "forma" ben definita; potrebbero esserci messagi che magari non richiedono una "ricevuta" da parte del client. Il server dovrà occuparsi delle conseguenze nel caso in cui non riceva la "ricevuta" entro un determinato tempo. Dovrò inventare qualcosa che consenta al client di eliminare messaggi (comandi) ricevuti in ritardo, etc.

E' sicuramente complicato ma la cosa peggiore è che poi dovrò recuperare tutto il codice scritto finora e sfruttarlo usando quel "protocollo", il che è faticoso e rischioso (incasinare tutto :)).

Infine, proprio oggi ho letto che un membro, @susu, aveva deciso di imitare un'app già sul mercato (o forse più di una) migliorandola (usando un metodo diverso per visualizzare filmati). C'è riuscito e grazie a questo ha guadagnato 100.000 dollari.
Sembra una buona notizia, invece non lo è: magari io mi ammazzo per fare questo gioco (inedito) e poco dopo qualcuno lo imita, lo fa meglio e mi frega il mercato :D

Data la mia sfiga congenita (e la mia scarsezza in fatto di GUI) questo è anche molto probabile.


Grazie mille per il tuo interessamento.
 

IlCasti

Active Member
Licensed User
Longtime User
Adesso provo a commentare (e capire, oggi il mal di capa... grrrr) ciò che hai scritto però anticipo subito che il problema non riguarda soltanto le fasi di gioco vero e proprio, cioè non soltanto le "mosse" dei giocatori e le loro conseguenze, in quanto, durante il gioco, mentre un giocatore è di turno ed ha un timer (20 sec - timer tra l'altro sul server, non sul client) che gli dà il tempo di fare la propria mossa, gli altri giocatori dovranno poter fare altro, come ad esempio inviare oggetti (immagini) agli altri (ad esempio un giocatore offre il caffè a tutti gli altri oppure chiede l'amicizia ad un altro). Anche queste informazioni saranno scambiate tra client e server e tra server e clientS ed anche in questi casi potrebbero esserci client con connessione lenta.

I problemi nascono quando un client con connessione lenta, il quale è stato è stato "momentaneamene sostituito dal server", riceve poi tutte insieme le comunicazioni accodate, accumulate mentre il suo dispositivo non era in grado di riceverle.

Inoltre, mentre l'oggetto websocket che fa da canale di comunicazione client <---> server segnala connessione-disconnessione, non segnala certo ritardi né tantomeno consente di eliminare messaggi dalla coda (anzi, non si parla proprio di code, nella varia documentazione).

Secondo me, qualsiasi sia il tipo di informazione che devi passare, che avvenga tutto di botto, credo poco importi al giocatore.
Per lo meno, ti faccio un esempio: io gioco a clash of royale, quando la connessione è lenta, va e viene, non posso schierare nulla nel campo perchè il server non riceve
Io a video potrei vedere la carta in battaglia, disabilitata e nel contempo non poter fare nulla contro l'avversario che mi schiaccia.
Al tempo stesso non vedo le carte che esso stesso gioca a ripetizione. E' fastidioso poi vedere che, quando torna la rete a pieno, lui ha 1000 truppe schierate
e tu nemmeno una. Ma nel gioco ci sta. Nessuno si è mai lamentato, a parte qualche madonna volante :D

Io opterei per questo tipo di soluzione.
A stecca le info dei passaggi gioco, a stecca anche le altre info, mascherate in messaggi in background? (che ne so, fai 4 iconcine con i tip numerici per avvisare che sono arrivate info nel frattempo) senza così perdersi troppo nelle altre modifiche. Chiaramente solo in aggiornamento con il restante lavoro a carico del client con le info vecchia salvate.
Tieni conto che chi vuole giocare, non si preoccuperà di questo, ma se mai di avere sempre una connessione stabile per poter giocare indisturbato. Tutti sanno che se c'è poco segnale, o si è lenti è quasi preferibile in quel momento rinunciare per momenti migliori.

Infine, proprio oggi ho letto che un membro, @susu, aveva deciso di imitare un'app già sul mercato (o forse più di una) migliorandola (usando un metodo diverso per visualizzare filmati). C'è riuscito e grazie a questo ha guadagnato 100.000 dollari.
Sembra una buona notizia, invece non lo è: magari io mi ammazzo per fare questo gioco (inedito) e poco dopo qualcuno lo imita, lo fa meglio e mi frega il mercato :D

Data la mia sfiga congenita (e la mia scarsezza in fatto di GUI) questo è anche molto probabile.

Ce ne sono mille mila. La grafica fa grande differenza. Se davvero dovessi avere un'idea redditizia, un piccolo investimento in un design accattivante, io lo farei.
;)
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Hai pienamente ragione e mi hai dato degli spunti interessanti.

1) è evidente che non gioco mai quindi non so cosa accada in giochi del genere (ergo, dovrei installarne qualcuno e provare). Però è anche vero che tu dici che, in caso di scarsa connessione, vedi il campo disabilitato: e questo come avviene? Il gioco è in grado di valutare la qualità della connessione, secondo te? Perché non vedo come potrebbe avvenire dopo una sorta di ping fittizio.

2) fregarmene e aspettare gli smadonnamenti degli utenti :p

Ce ne sono mille mila. La grafica fa grande differenza. Se davvero dovessi avere un'idea redditizia, un piccolo investimento in un design accattivante, io lo farei.
Anche questa sarebbe un'ottima idea, ma difficile da realizzare; a chi affidarla? Come fidarsi che non ti freghino l'idea?

Io sono certo che l'app avrebbe successo, direi quasi quanto un Texas Hold'em Poker!
Se trovassi una sw house che la acquistasse per 100.000 euro, accetterei, benché io sia sicuro che una buona sw house riuscirebbe a ricavarne qualche milione!


Grazie ancora
 

LucaMs

Expert
Licensed User
Longtime User
Una cosa è certa: DEVO metterci molto più impegno, tempo e darmi una mossa!
Non riesco a fare a meno di mettermi qui e rispondere ai vari post, anche se non mi riguardano; dev'essere fifa, la fifa di fallire! grrrrrrrrrrrrrrr
Comunque, sto scrivendo questo post anche perché sto per raggiungere i 10.000 ed a quel punto mi dedicherò solo all'app sicuramente :D
[questo è il mio 9.979mo post, ancora 21 e... vinco la mucca Carolina :p]
 

IlCasti

Active Member
Licensed User
Longtime User
Hai pienamente ragione e mi hai dato degli spunti interessanti.
1) è evidente che non gioco mai quindi non so cosa accada in giochi del genere (ergo, dovrei installarne qualcuno e provare). Però è anche vero che tu dici che, in caso di scarsa connessione, vedi il campo disabilitato: e questo come avviene? Il gioco è in grado di valutare la qualità della connessione, secondo te? Perché non vedo come potrebbe avvenire dopo una sorta di ping fittizio.
Non ni disabilita il campo di battaglia in se ma è come se ti freezasse la giocata
Nel senso che prendi la carta, la trascini o la posizioni e, probabilmente a causa di un messaggio KO perchè non si riesce a comunicare
con il server
, non te la lascia posizionare e ritorna nel mazzo.

2) fregarmene e aspettare gli smadonnamenti degli utenti :p
Ma quelli ci sono sempre, in ogni categoria... io smadonnavo anche per Ruzzle :D

Anche questa sarebbe un'ottima idea, ma difficile da realizzare; a chi affidarla? Come fidarsi che non ti freghino l'idea?
Secondo me qua su sul forum sicuro che qualcuno lo trovi o che ti sappia indirizzare

Io sono certo che l'app avrebbe successo, direi quasi quanto un Texas Hold'em Poker!
Se trovassi una sw house che la acquistasse per 100.000 euro, accetterei, benché io sia sicuro che una buona sw house riuscirebbe a ricavarne qualche milione!
Potrebbe essere valida l'alternativa del crowdfunding? :rolleyes:

Grazie ancora
Con questo post mi sta tornando la voglia di rimettere mano alla mia app. Grazie a te! ;)
 

IlCasti

Active Member
Licensed User
Longtime User
Una cosa è certa: DEVO metterci molto più impegno, tempo e darmi una mossa!
Non riesco a fare a meno di mettermi qui e rispondere ai vari post, anche se non mi riguardano; dev'essere fifa, la fifa di fallire! grrrrrrrrrrrrrrr
Comunque, sto scrivendo questo post anche perché sto per raggiungere i 10.000 ed a quel punto mi dedicherò solo all'app sicuramente :D
[questo è il mio 9.979mo post, ancora 21 e... vinco la mucca Carolina :p]
I post ti fregano un po'.. dipende quanto scrivi poi!
Certo volontà, impegno e tempo sono tutto :(
 
Top