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 - client Android server C# Socket
Forum - Android - client Android server C# Socket

Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 15:19
Lunedì, 17/11/2014
Ho un problemino con le socket :(
Per la connessione tutto ok, mi si connetto e riesco anche ad inviare i messaggi dal server al client; il problema è con la disconnessione:
In android (client) ho scritto questo:
Codice sorgente - presumibilmente Android

  1. //evento del pulsante DISCONNESSIONE
  2.     public void Disconnessione (View v) {
  3.         try{
  4.             miaSocket.shutdownInput();
  5.             miaSocket.close();
  6.         }
  7.         catch(IOException e){
  8.             lblState.setText("ERRORE!!! " + e);
  9.         }
  10.     }



In C# (server) ho scritto questo:

Codice sorgente - presumibilmente C#

  1. TcpListener server = new TcpListener(ep);
  2.             server.Start();
  3.             //il server rimane sempre in ascolto
  4.             while (true)
  5.             {
  6.                 Proprieta.StatoConnessione = "Waiting for a connection... ";
  7.                 Socket s = server.AcceptSocket();
  8.                 Proprieta.StatoConnessione = "Server is connected.";
  9.                 //invio dei messaggi al client
  10.                 while (s.Connected)
  11.                 {
  12.                     if(Proprieta.Messagio != "")
  13.                     {
  14.                         Proprieta.StatoConnessione = "Sending message ... ";
  15.                         ASCIIEncoding asen = new ASCIIEncoding();
  16.                         s.Send(asen.GetBytes(Proprieta.Messagio));
  17.                         Proprieta.StatoConnessione = "Message sent." + Proprieta.Messagio;
  18.                         Proprieta.Messagio = "";                        
  19.                     }
  20.                 }
  21.                 s.Shutdown(SocketShutdown.Both);              --->CI ARRIVA SOLO SE USO IL DEBUGGER o.O ???PERCHE?
  22.                 s.Close();
  23.                 Proprieta.StatoConnessione = "Connection shut down.";
  24.             }



Il problema è che non mi si chiude la connessione :(
Con il debugger di android, ho visto che la connessione mi si chiude, però su c# me la vede sempre connessa :(
Anche se, come ho evidenziato: mi vede che si chiude la connessione in C# solo su uso il debugger; MA PERCHEEE????
Se lo eseguo normalmente non esce mai dal ciclo while :(
Qual è la motivazione?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:45
Lunedì, 17/11/2014
Come già detto bisogna controllare il ping della risposta per sapere se l'altro è ancora connesso, la proprietà Connected non va bene. Puoi prendere un ping 999 come limite della disconnessione, se fai la prova del ping di una risposta e questa risulta in un ping maggiore di 999 il client è disconnesso.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 9:01
Martedì, 18/11/2014
Come faccio a fare il ping? C'è già una funzione apposita o devo fare una cosa più rupestre del tipo: al client faccio inviare ogni secondo il messaggio "ci sono", e se il server non lo riceve vuol dire che è disconnesso?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:57
Martedì, 18/11/2014
Esiste il timeout di connessione, puoi impostare quello per la ricezione / invio e se l'eccezione è stata lanciata per timeout sai che il client si è disconnesso. Esiste poll ma quando lo uso io non funziona -.-

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 9:46
Mercoledì, 19/11/2014
Ok, risolto ;)
ho usato il ReceiveTimeOut; l'ho impostato a 3 secondi; rimane in ascolto per 3 secondi, se non arriva niente (scade il tempo) ho catturato la exeption, senza farli fare niente, così da poter continuare col ciclo; se arriva il messaggio "ADDIO" esce dal ciclo e si disconnette.
Codice sorgente - presumibilmente Android

  1. while (clientAttivo)
  2.                 {
  3.                     //aspetto che il client mi invii il messaggio
  4.                     try
  5.                     {
  6.                         s.ReceiveTimeout = 3000;
  7.                         k = s.Receive(receiverBuffer);
  8.                         for (int i = 0; i < k; i++)
  9.                         ricevuto += Convert.ToChar(receiverBuffer[i]).ToString();
  10.                         if (ricevuto == "ADDIO")
  11.                             clientAttivo = false;
  12.                     }
  13.                     catch(SocketException){
  14.                        
  15.                     }



Una cosa che magari potrei chiederti è se c'è un modo per migliorarlo ancora di più :)
Grazie mille intanto

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:15
Mercoledì, 19/11/2014
Testo quotato

Postato originariamente da Dice:

Ok, risolto ;)
ho usato il ReceiveTimeOut; l'ho impostato a 3 secondi; rimane in ascolto per 3 secondi, se non arriva niente (scade il tempo) ho catturato la exeption, senza farli fare niente, così da poter continuare col ciclo; se arriva il messaggio "ADDIO" esce dal ciclo e si disconnette.
Codice sorgente - presumibilmente Android

  1. while (clientAttivo)
  2.                 {
  3.                     //aspetto che il client mi invii il messaggio
  4.                     try
  5.                     {
  6.                         s.ReceiveTimeout = 3000;
  7.                         k = s.Receive(receiverBuffer);
  8.                         for (int i = 0; i < k; i++)
  9.                         ricevuto += Convert.ToChar(receiverBuffer[i]).ToString();
  10.                         if (ricevuto == "ADDIO")
  11.                             clientAttivo = false;
  12.                     }
  13.                     catch(SocketException){
  14.                        
  15.                     }



Una cosa che magari potrei chiederti è se c'è un modo per migliorarlo ancora di più :)
Grazie mille intanto



sul catch clientAttivo = false;

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 18:15
Giovedì, 27/11/2014
Rieccomi con un altro problema :(
Allora: sono riuscito a far funzionare client-server tutto per bene; tranne per il fatto che se il mio client (cioè l'applicazione android che risiede sul mio cellulare) si trova su una rete diversa da quella server, non riesce a connettersi :(
Vi spiego meglio: io il lavoro lo faccio nel mio ufficio; nel server C# ho messo IPEndPoint(X, Y); nel client Android ho messo miaSocket = new Socket(X, Y); l'IP e la PORTA sono gli stessi su client e server.
Se lavoro nel mio ufficio funziona tutto perfettamente.
Però se provo ad utilizzare l'applicazione da casa mia non riesco a collegarmi :(
Vi prego aiutatemi :hail:
C'è un modo per risolvere?

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 21:18
Giovedì, 27/11/2014
Probabilmente non si tratta tanto di un problema nella programmazione, quanto nel networking. Per connetterti dall'esterno della rete non devi usare lo stesso IP; probabilmente stai usando quello interno (192.168.x.x), e ciò è giusto in LAN, ma non può funzionare da fuori. Per connetterti dall'esterno è necessario usare l'IP pubblico o esterno del gateway (router) dell'ufficio, che a sua volta deve essere correttamente configurato (port forwarding) per reindirizzare le richieste che arrivano dall'esterno su una data porta verso l'IP interno del PC server dove gira il programma.

PM Quote