Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Android - problema gestione socket durante il cambio di rete
Forum - Android - problema gestione socket durante il cambio di rete

Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 9:57
Martedì, 16/12/2014
Ho un client android e un server c# che comunicano attraverso una socket; funziona tutto ok; però c'è un problemino con la gestione delle socket :(
Il fatto è che client e server dovrebbero stare sempre connessi, perchè il server potrebbe inviare i messaggi al client in qualunque momento; il problema è che l'utente android può spostarsi dove li pare e quando si sposta troppo c'è il cambiamento di cella, col relativo cambiamento di rete (come quando dall'ufficio si ritorna a casa e viceversa). Visto che cambia la rete (il cellulare si disconnette dalla vecchia rete e si collega ad una nuova rete) la socket si disconnette e quindi il server non riesce più ad inviare i messaggi al client.
La mia domando è: come posso gestire una tale situazione? come mi conviene gestire le socket? Pensavo di fare una cosa del genere: che il server, non appena ha un messaggio da inviare fa questa serie di operazioni: connettiti al client-invia messaggio-disconnettiti. (però non so se è realizzabile una cosa del genere, perchè il server per connettersi con il client usa la funzione acceptSocket() che è bloccante e aspetta che sia il client a connettersi).
Voi cosa mi consigliate di fare?
Grazie mille in anticipo :)

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 12:28
Martedì, 16/12/2014
Testo quotato

Postato originariamente da Dice: connettiti al client-invia messaggio-disconnettiti. (però non so se è realizzabile una cosa del genere, perchè il server per connettersi con il client usa la funzione acceptSocket() che è bloccante e aspetta che sia il client a connettersi).



Ti ricordi bene, il server per definizione attende la richiesta di connessione dal client; non può cercare di connettersi di propria iniziativa anche perché non saprebbe verso che ip cercare di connettersi(si potrebbe ovviare implementando un server ibrido che all'occorrenza possa cercare di connettersi ad un altro server ma a questo punto anche il client dovrebbe implementare una gestione ibrida, e alla prima connessione dovrebbe notificare al server il suo indirizzo ma come fai notare tu questo cambia abbastanza spesso, ma qua si sfocia quasi in un simili discorso di instradamento.

Normalmente il client inserito in un servizio periodicamente interroga il server per verificare la presenza di notifiche ancora non ricevute, in questo modo la connessione può essere chiusa tra una richiesta ed un altra(anche se stiamo parlando di TCP/IP quindi commutazione di pacchetto).
Ricordati che in questo caso le verifiche vanno fatte sull'orario o su un counter quindi nel primo caso il server e il client dovranno essere sincronizzati.

PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 12:31
Martedì, 16/12/2014
Ciao!
Come vedi la gestione della connettività in generale è una grossa grana...
Tempo fa ti avevo consigliato il servizio di google perchè da un lato professionale è meglio appoggiarsi a qualcosa di solido che a qualcosa di fatto in casa.
Il discorso è semplice...
Se quello che devo fare lo faccio per passione e per hobby allora posso pure i socket e fare l'app usando l'NDK(ovviamente con parti in asm :asd:)... Farmi il mio protocollo e tutto quello che voglio io...
Tutt'altra cosa se il programma/webapp/app che devo fare è per lavoro e devo rispettare budget(quindi ore di lavoro), tempi e una certa qualità del servizio che offro.
Inoltre la mia idea è che se devo sviluppare qualcosa(ovviamente intendo qualcosa legato al mondo business, es. un gestionale, un app di supporto al venditore, etc..) non devo "perdere" tempo nella gestione della rete o comunque nella gestione di tutte le cose tecniche di basso livello(non significa che devo fregarmene). Il tempo a disposizione andrebbe utilizzato maggiormente proprio nella creazione del programma stesso(quindi tutta la logica di business, ui, etc...)... Anche perchè il cliente non paga i socket ma paga l'app :rotfl:

Ultima modifica effettuata da tasx il 16/12/2014 alle 12:32
PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 16:58
Martedì, 16/12/2014
E' un'ingiustizia però :(
In parole povere dovrei fare così: quando non sei più connesso (l'utente con il cellulare si sposta da una rete a un'altra) stoppa il servizio (uso un servizio per il collegamento con le socket); poi quando si connette alla nuova rete fai partire il servizio.
Dico bene, oppure c'è qualcosa che non va bene nella procedura? Devo implementare un piccolo protocollo "MADE AT HOME", come dicevi te tasx, giusto? Mi puoi dare qualche dritta (o anche storta :rotfl:)?

Un'altra cosa: ho letto qualcosa sul GCM, e se ho capito bene è strutturato così:
App Client <- GCM (server intermediario) <- Server .NET.
Però ho visto un paio di esempi sul web in cui il server in .NET è stato creato con Visual Web Studio (in pratica hanno creato una pagina web per effettuare la comunicazione con il GCM). Me lo confermate?
Io volendo non posso usare una semplice Socket per connettermi al GCM?
Mi potreste spiegare qualcosina? :hail:  (intanto continuo le mie ricerche come meglio posso ;) )
Magari se c'è li avete mi potete mettere dei link con degli esempi per farmi capire meglio (se si può).

Grazie mille per il supporto ;)

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:20
Martedì, 16/12/2014
Testo quotato

Postato originariamente da Dice:

E' un'ingiustizia però :(
In parole povere dovrei fare così: quando non sei più connesso (l'utente con il cellulare si sposta da una rete a un'altra) stoppa il servizio (uso un servizio per il collegamento con le socket); poi quando si connette alla nuova rete fai partire il servizio.
Dico bene, oppure c'è qualcosa che non va bene nella procedura? Devo implementare un piccolo protocollo "MADE AT HOME", come dicevi te tasx, giusto? Mi puoi dare qualche dritta (o anche storta :rotfl:)?



Perché ingiustizia? Il servizio rimane avviato sempre anche quando la tua app è chiusa, periodicamente si connette al server e dice "Server io mi sono connesso l'ultima volta alle ore xx:xx. Da allora è successo qualcosa che dovrei sapere?" il server risponde "Si, ho una notifica, Gino a scritto un post alle yy:yy in cui dice che ha fatto le fragole col cioccolato fondente, ti mando una foto e le coordinate per raggiungerlo e papparti questa delizia" il client riceve i dati e chiude la connessione. Periodicamente la procedura viene ripetuta senza mantenere una connessione costantemente aperta (ripeto) cosa che nella commutazione a pacchetto non succede mai per definizione.

Eseguendo questo processo periodico sei indipendente dalla connessione che hai ad un più basso livello in quanto la "connessione" dura per qualche decimo di secondo, e se non va a buon fine comunque un altro tentativo verrà effettuato dopo un pò di tempo, quindi in casi normali anche la gestione degli errori non deve essere cosi sofisticata.

Se non ricordo male o tu o un altro utente qualche giorno fa aveva chiesto perché la proprietà Connected della classe TCPClient non segnalasse correttamente se la connessione era effettivamente presente nel momento in cui la proprietà viene letta, la motivazione è semplice nel protocollo TCP i dati vengono inviati attraverso pacchetti indipendenti questi arrivano al destinatario secondo delle linee pseudo-casuali(Assolutamente errato ma non vorrei perdermi nella spiegazione dell'instradamento dei pacchetti) quindi effettivamente non c'è una connessione diretta tra client e server, come nella connessione telefonica che c'era una volta, dove veniva riservato un lunghissimo cavo che andava dal tuo telefono al telefono del ricevente, quindi puoi capire che l'unico modo per sapere se sono "connesso" ancora al server e inviarli un pacchetto e vedere se c'è una risposta da parte sua.

Ultima modifica effettuata da Roby94 il 16/12/2014 alle 19:24
PM Quote