Dice (Normal User)
Expert
Messaggi: 238
Iscritto: 26/11/2011
|
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 |
//evento del pulsante DISCONNESSIONE
public void Disconnessione (View v) {
try{
miaSocket.shutdownInput();
miaSocket.close();
}
catch(IOException e){
lblState.setText("ERRORE!!! " + e);
}
}
|
In C# (server) ho scritto questo:
Codice sorgente - presumibilmente C# |
TcpListener server = new TcpListener (ep ); server.Start(); //il server rimane sempre in ascolto while (true) { Proprieta.StatoConnessione = "Waiting for a connection... "; Socket s = server.AcceptSocket(); Proprieta.StatoConnessione = "Server is connected."; //invio dei messaggi al client while (s.Connected) { if(Proprieta.Messagio != "") { Proprieta.StatoConnessione = "Sending message ... "; ASCIIEncoding asen = new ASCIIEncoding (); s.Send(asen.GetBytes(Proprieta.Messagio)); Proprieta.StatoConnessione = "Message sent." + Proprieta.Messagio; Proprieta.Messagio = ""; } } s.Shutdown(SocketShutdown.Both); --->CI ARRIVA SOLO SE USO IL DEBUGGER o.O ???PERCHE? s.Close(); Proprieta.StatoConnessione = "Connection shut down."; }
|
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? |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
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.
|
|
Dice (Normal User)
Expert
Messaggi: 238
Iscritto: 26/11/2011
|
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?
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
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 -.-
|
|
Dice (Normal User)
Expert
Messaggi: 238
Iscritto: 26/11/2011
|
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 |
while (clientAttivo)
{
//aspetto che il client mi invii il messaggio
try
{
s.ReceiveTimeout = 3000;
k = s.Receive(receiverBuffer);
for (int i = 0; i < k; i++)
ricevuto += Convert.ToChar(receiverBuffer[i]).ToString();
if (ricevuto == "ADDIO")
clientAttivo = false;
}
catch(SocketException){
}
|
Una cosa che magari potrei chiederti è se c'è un modo per migliorarlo ancora di più
Grazie mille intanto
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
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 |
while (clientAttivo)
{
//aspetto che il client mi invii il messaggio
try
{
s.ReceiveTimeout = 3000;
k = s.Receive(receiverBuffer);
for (int i = 0; i < k; i++)
ricevuto += Convert.ToChar(receiverBuffer[i]).ToString();
if (ricevuto == "ADDIO")
clientAttivo = false;
}
catch(SocketException){
}
|
Una cosa che magari potrei chiederti è se c'è un modo per migliorarlo ancora di più
Grazie mille intanto |
sul catch clientAttivo = false; |
|
Dice (Normal User)
Expert
Messaggi: 238
Iscritto: 26/11/2011
|
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
C'è un modo per risolvere?
|
|
GN (Member)
Guru
Messaggi: 772
Iscritto: 30/04/2011
|
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.
|
|