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

LucaMs

Expert
Licensed User
Longtime User
Fatto sta che SE riuscissi a sviluppare tutta 'sta roba in maniera ben fatta, passare poi da un Poker ad un Black Jack o a Briscola, non dico che sarebbe automatico, ma richiederebbe poche modifice e poco tempo; una volta che hai creato e gestito stanze, creato e gestito giocatori (bot compresi) e chatter, gestito le comunicazioni client-server, inserito pubblicità, etc. le regole ed i controlli sulle azioni effettuate dai giocatori in base al gioco specifico si dovrebbero piazzare in classi separate, e modificando queste e un po' di grafica lo sviluppo di ogni nuovo gioco prenderebbe al massimo un mese di tempo!

Questa "base" in un certo senso esiste già: Google Play Game Services (ora si è aggiunta (?) pure quella roba chiamata "Firebase").

Il punto, anzi i punti, sono:

1) quei servizi mi consentono di far compiere ai giocatori (ANCHE NON DI TURNO, gli altri al tavolo) tutte le azioni che voglio?
Ad esempio, solito esempio, Zynga Poker: il giocatore di turno ha tot secondi di tempo per fare la propria mossa; gli altri, nel frattempo, possono inviarsi "oggetti" (tipo asini offensivi o fiori alle donzelle virtuali); possono leggere le statistiche degli altri giocatori al tavolo; possono chattare nella chat della stanza da gioco; etc.

2) questi servizi sono accessibili, a noi di b4x, tramite l'unica libreria/wrapper attuale che è quella di Informatix; è aggiornata? Lo sarà sempre?

Certo questi servizi hanno anche il grande pregio di metterti a disposizione anche spazio server, mentre con b4j devi trovartelo, gestirtelo e pagartelo da te!

Altro che "Essere o non essere" (benché sia un'ottima questione), qui si tratta di: "Abbandonare o non abbandonare la programmazione in generale" !
 

LucaMs

Expert
Licensed User
Longtime User
"Testata modulo Main - b4j server":
B4X:
#Region  + VERSIONS  
' 30.0   07/13/2016
'       Gli è tutto da rifare
'       Rimettere websocket handler che rappresenti user, player, chatter, bot

State pronti: nel 2116 forse potreste scaricare la mia app :p
 

udg

Expert
Licensed User
Longtime User
State pronti: nel 2116 forse potreste scaricare la mia app :p

Potresti posticipare al 2117 ? Avrei già l'agenda piena per il 2116 e non vorrei perdermi la grande inaugurazione..ehehe

"Gli è tutto da rifare.." . Stai cercando di ottenere finanziamenti governativi? :)
 

LucaMs

Expert
Licensed User
Longtime User
Potresti posticipare al 2117 ? Avrei già l'agenda piena per il 2116 e non vorrei perdermi la grande inaugurazione..ehehe
Ok, vedrò cosa posso fare: ti va bene 31 dic 2122?


Stai cercando di ottenere finanziamenti governativi?
Eh, magari mi faccio finanziare dall'Unione Europea (prima che questa dia il consenso al nostro Governo di risanare le banche PRIVATE con i soldi di tutti i cittadini italiani).
 

LucaMs

Expert
Licensed User
Longtime User
Potresti posticipare al 2117 ? Avrei già l'agenda piena per il 2116 e non vorrei perdermi la grande inaugurazione..ehehe

"Gli è tutto da rifare.." . Stai cercando di ottenere finanziamenti governativi? :)
Ho letto che stai smanettando anche tu con server (anche se solo locali).

Me spiace, nun te posso da' 'na mano, sia perché nun conosco l'inglese :p , sia perché, come vedi, ho già sufficiente "lavoro" da indurmi al suicidio anticipato(solo anticipato, perché è comunque in agenda, a proposito di agende!)
 
Last edited:

udg

Expert
Licensed User
Longtime User
Volevo capire se mantenere sqlite introducendo un b4j server senza ui come elemento di mezzo tra db e clienti vari. Se nun me garba ritorno su mysql come fatto in passato
 

LucaMs

Expert
Licensed User
Longtime User
Direi che se sei veloce con MySql e PHP e magari hai già una base pronta, meglio usare quello.

Altrimenti dovresti cercare, tra i vari esempi web server, quello che più si avvicina alle tue necessità. C'è però il problema che questi funzionano su Internet, non in locale, quindi andrebbero adattati.

Ma il famigerato MQTT che mi pare tu abbia studiato? Non è adatto?
 

udg

Expert
Licensed User
Longtime User
In questo caso mqtt non mi è utile. Si tratta del classico client-server circoscritto alla lan locale, tipo piccolo ufficio dove più postazioni operano sugli stessi archivi. In verità sarà anche raro che debbano aggiornare gli stessi dati; che lo facciano contemporaneamente è ancora più difficile.
Per questo pensavo di mantenere la comodità di installazione di sqlite introducendo un middle-layer che esponga funzioni ad alto livello per i client da un lato ed operi sul db in modo esclusivo dall'altro.
L'alternativa era tradurre il sw esistente per Mysql in modo che ogni client lavorasse direttamente con il db. Il freno principale è che temo che diversi clienti non siano in grado di installarsi Mysql. Già con jre devo vedere se non mi conviene creare un exe unico (ma sarei limitato ai pc windows).

Una breve sperimentazione e qualche commento della community dovrebbero essere sufficienti per prendere una decisione.

A te come procede? Hai deciso che tipo di oggetti creare?
 

LucaMs

Expert
Licensed User
Longtime User
Si tratta del classico client-server circoscritto alla lan locale
Sì, ma tramite wifi!

Non so che dirti, in questo momento ho le idee più confuse del solito. Anche perché molto dipende ANCHE dalla situazione attuale:
L'alternativa era tradurre il sw esistente per Mysql



Ricordo vagamente un post proprio nel forum italiano in cui qualcuno voleva utilizzare uno degli esempi web server ma in locale; non so se abbia risolto.

Ci sarebbe anche RDC, ma sempre su Internet finisce; se questo non fosse un problema, ovvero tutti i dispositivi in gioco potessero connettersi, potresti limitare l'accesso ai soli utenti locali, ovviamente.


A te come procede? Hai deciso che tipo di oggetti creare?
"Deciso" è una parola grossa! Probabilmente la più difficile nel mio vocabolario :p

Per il momento, proprio oggi, malgrado le mille interruzioni, ho preso l'ultima versione preparata (che era ad un passo dal consentirmi di dedicarmi esclusivamente al gioco vero e proprio) che non mi piaceva affatto - più avanti provo a spiegare - ed ho PEDESTREMENTE modificato con i comandi Sostituisci un bel po' d'istruzioni; ora devo andare a vedere cosa sia successo :p.

E' complicato spiegarlo e se uno non è davvero interessato, è impossibile capirlo.
Però può essere utile a capire, in minimissima parte, come funziona un websocket server B4J.

In un websocket server scritto con B4J, esistono classi "speciali" che ricevono, da dietro le quinte (cioè dall'ambiente B4J) un oggetto websocket per le comunicazioni.
Queste classi, quindi, chiamate "websocket handler", sono le uniche che comunicano col client.
Anche seguendo gli esempi, decisi che una "websocket handler class" dovesse rappresentare un giocatore e iniziai a scrivere codice con questa idea.
Poi, l'idea genialie (auto-ironico :p): dato che la OOP è sempre la soluzione ideale, avrei dovuto creare come minimo queste classi:

wshUser - la classe websocket handler che rappresenta l'utente - la comunicazione col client.
clsPlayer - giocatore
clsChatter - chiacchieratore :D
clsBot - giocatore fasullo
clsGameRoom - stanza da gioco
clsChatRoom - stanza da chat

Quindi un oggetto Player (clsPlayer) avrebbe posseduto un oggetto wshUser tramite il quale comunicare.
Stessa cosa l'oggetto Chatter.
Il bot avrebbe dovuto essere una sotto-classe di Player oppure avrei dovuto usare dei flag per modificare il comportamento a seconda del tipo di giocatore (Player o Bot) nella medesima classe.

Fatto tutto questo, iniziato lo sviluppo, mi sono reso conto della grande str...ta fatta: molto codice veniva inutilmente duplicato (col rischio quindi di errori, bug e confusione) perché wshUser riceveva-trasmetteva comandi tra client e server ma poi doveva passarli pari-pari al clsPlayer, che a sua volta magari inviava comandi alla GameRoom e, viceversa, un comando GameRoom diretto al Player poi doveva, tramite questo, passare al wshUser. Figuriamoci poi eventuali eventi!

Ora torno all'idea iniziale, ma dovendo provarci modificando la seconda, perché sicuramente contiene codice scritto successivamente e necessario.

Insomma, come ho già scritto, state pronti... ma a chiamare per me psichiatri di grido :p


Bene, ho scritto tutto questo e la tua era una domanda, come si dice... non mi viene; insomma, tipo: "E tu come stai?" :p
(di cortesia? Boh, non mi viene il termine giusto, me devi aiuta' tu, in questo... HHHUUUHHH)


P.S. tanto per dire quanto il tutto sia semplice, dimenticavo di citare alcune altre cosette:

1) per rendere più veloce il server (speranza) penso si debba sfruttare il fatto che le routine di una classe websocket handler girino nel proprio thread appositamente (e automaticamente) creato; per questo, i comandi CallSubDelayed funzionano anche in maniera differente rispetto a B4A;
2) cosa-come-quando-dove salvare dati su DB? Cosa durante una partita? Cosa in altri momenti?
3) creare un interprete di comandi per la comunicazione client-server (che chiami routine con parametri)?
4) salvare l'andamento delle partite su DB? Durante una partita, dovrei dare la possibilità ad un giocatore NON di turno, di fare altre cose... se tra queste egli fa qualcosa di scorretto, come scrivere nella chat nella stanza (sempre se la metto) parolacce e qualcuno lo segnala (da implementare) poi dovrei andare a verificare
5) creare classi speciali per contenere "dati" da inviare?
6) creare classi "contenenti" regole del gioco "specifico"? (da ricordare che vorrei che il tutto potesse in futuro servire per altri giochi simili);
7) creare classi di "verifica azione utente"?
8) creare un utente speciale che possa entrare "invisibile" nelle varie stanze? (per "amministrare")
9) se non ricompro occhiali da "preside", oltre a diventare cieco, il naso mi finirà in bocca, dato che lo uso per "diminuire la gradazione da miope" :p
11) non ho un accendino funzionante, quindi devo alzarmi ogni volta ed andare ad accendere la sigaretta in cucina)

ORMAI HO SBROCCATO: SE VEDE? :p:p:p
Non so nemmeno in quale thread sto scrivendo!

ah, gestire le "cadute" dei player durante il gioco (connessione persa, riconnessione "ad" una nuova websock handler class!)
 
Last edited:

nonno

Active Member
Licensed User
Longtime User
Qualcuno se per favore potrebbe aiutarmi a capire come funziona...
ho scaricato da Erel il file WebSocket- B4J e WebSocKetExample - B4A comunicano perfettamente il mio problema che vorrei inviare non delle stringhe di testo, ma un file di testo :-( come posso fare?
p.s. non sono un programmatore perciò se qualcuno mi vorrebbe darmi dei consigli non spiegatemi in termini troppo tecnici.
Grazie
 

nonno

Active Member
Licensed User
Longtime User
LucaMS scusa se ti disturbo
non và mi da errore, ho cambiato il numero di porta visto che con WebSocket- B4J e WebSocKetExample - B4A comunicavano sulla porta 6970, cosi lo sostituita sia sul file B4A che B4J
il file B4J si mette in ascolto il problema da quel poco che capisco sta sul file Cliente ("errore has occurend il sub :main_cc_result(java line :395 java.io FileNotFundExceptio:/storage/emulated/0/Primi.txt:eek:pen lailed: EACCES.....")
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Quel messaggio indica che non trova il file Primi.txt.

Se non sbaglio, tu lanci l'app sul dispositivo Android, selezioni un file da inviare al server e, subito dopo la selezione, ricevi quell'errore.

Hai modificato la routine cc_Result dell'esempio?
 

nonno

Active Member
Licensed User
Longtime User
no! sinceramente non capisco di cosa parli, non invia nemmeno se inserisco un messaggio nella textMessagge,
da li premendo sul pulsante sen Message non succede nella... non invia e non da errore.
 

LucaMs

Expert
Licensed User
Longtime User
no! sinceramente non capisco di cosa parli, non invia nemmeno se inserisco un messaggio nella textMessagge,
da li premendo sul pulsante sen Message non succede nella... non invia e non da errore.

Sono due cose diverse.
Dal primo post, si capisce che tu selezioni un file ma non viene trovato (e non so perché, se non hai modificato la "Sub cc_Result".

Il secondo, il tentativo di inviare un messaggio di testo, probabilmente non funziona perché devi usare gli indirizzi giusti, la porta giusta e CONFIGURARE IL ROUTER.

Tutto questo è già difficile per un programmatore (un programmatore non deve necessariamente conoscere anche robaccia relativa a reti, router, etc).

Aspetta che guardo se qualche post nel forum italiano spiega già come configurare un router, mi sembra di sì.
 

LucaMs

Expert
Licensed User
Longtime User
E' una cosuccia lunga e complicata; ora non ho molto tempo. Provo a copiarti qui ciò che dice Erel in quel thread (da dove hai scaricato i sorgenti) ed a tradurlo alla buona:



The following steps are required in order to make your server accessible over the internet:
  1. As the router (or computer) external IP address changes from time to time we need to use a service that maps a known address to our dynamic address. In this case I used a free service named DuckDNS. You should register with them and choose a unique domain for your server.
    They will also provide you with a token. In the Main module we use a timer to call their service (with this token) every 10 minutes. This updates the IP address if needed.
  2. Router setup
    • Port forwarding - Configure the router to forward all incoming requests on the given port to your computer address.
    • Static IP - On some routers port forwarding will only work with a specific local IP address. The solution is to configure the router to always provide your computer with the same address.
    • Search Google for instructions specific to your router.
  3. Firewall - You need to allow incoming connections on the specific port.



I passi seguenti sono necessari per far sì che il tuo server sia accessibile su Internet:

1) dato che l'indirizzo ESTERNO del router cambia di tanto in tanto [direi soprattutto se spegni il router ogni giorno] hai bisogno di... va beh, qui complichiamo ancora le cose; per il momento supponiamo che tu non spenga il router e quindi questo abbia sempre lo stesso indirizzo pubblico.
2) Impostazione del Router
* Port forwarding - configurare il router per fare in modo che ogni richiesta che esso riceve (dall'esterno, da Internet) venga diretta al computer sul quale tu hai installato il server b4j (lanciato il file!)
...
etc.

"Cercare su Goole le istruzioni per il tuo router specifico"
 
Top