Cerca

VB.NET – Ricevere messaggi via Socket [Socket Listener]

Indice Articolo

Ultimi articoli pubblicati

Ieri ho scritto un articolo su come inviare dei messaggi via Socket. Come promesso sono qua a scrivervi su come realizzare un ricevitore di messaggi via Socket. Naturalmente come ieri le classi da importare nel progetto sono le stesse e vi invito a vederle nel articolo di ieri.

Io ho realizzato una applicazione di console la quale non fa nient’altro che scrivere sulla console i messaggi inviati dal mittente. Nella main della mia applicazione ho inserito tutto il codice che si mette in ascolto su una determinata porta del mio PC. Il codice è questo:

Dichiarate le seguenti variabili:

Dim host As IPAddress
Dim mySock As Socket
Dim ip As IPHostEntry
Dim ep As IPEndPoint
Dim listener As TcpListener

Una volta dichiarate le variabili ecco qua il corpo del programma. Qua viene utilizzata una funzione che elabora il messaggio in ingresso:

Try
‘Viene preso l’IP della macchina locale
ip = Dns.GetHostEntry(Dns.GetHostName())
host = IPAddress.Parse(ip.AddressList(0).ToString())
‘Creato l’EndPoint sulla porta 8200 (Porta di ascolto)
ep = New IPEndPoint(host, 8200)
‘Dichiarato il Socket di tipo TCP
mySock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
‘Dichiarata variabile di tipo TCPListener per far partire l’ascolto
listener = New TcpListener(ep)
listener.Start()
While True
‘Aspetto una connessione
mySock = listener.AcceptSocket()
‘Quando arriva la connessione chiamo la funzione Elabora Messaggio passando il socket
ElaboraMessaggio(mySock)
End While
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try

La funzione che Elabora il messaggio in ingresso  invece è cosi composta:

Dim buffer(1024) As Byte
Dim ByteDaLeggere As Integer

Una volta dichiarato il buffer e una variabile di tipo integer che ci dice quanto dobbiamo leggere, il codice è questo:

Try
‘Controllo se il socket è ancora connesso
If mySocket.Connected Then
‘Ricavo la lunghezza dei byte da leggere. Qua viene caricato anche il buffer
ByteDaLeggere = mySocket.Receive(buffer)
‘Faccio l’encoding del buffer per ricavare la stringa
Dim ritorno As String = Encoding.ASCII.GetString(buffer)
‘Scrivo il messaggio letto
Console.WriteLine(ritorno.TrimEnd())
End If
Catch ex As Exception
Throw ex
End Try

Se ci sono connessioni lente e messaggi tanto lunghi bisogna naturalmente ciclare sulla funzione di lettura fino a quando non si leggono tutti i byte. Questo è tutto. Nel video sotto potete vedere il risultato della applicazione di ieri e quella di oggi. Un invio e ricezione in questo caso sulla stessa macchina.

8 risposte

  1. Post illuminante, complimenti.
    Ci ho provato anche io e funziona, almeno in locale le 2 applicazioni si parlano.
    Però vorrei fare di più: il listener deve a sua volta rispondere, quindi vorrei ricevere il messaggio nella stessa applicazione da cui l’avevo inviato (cioè ognuna delle 2 parti deve fare da invio e da listener). Come si procede in questi casi?

  2. Ciao Ghibo,
    Una volta che si crea il canale di comunicazione tra i due client sullo stesso socket puoi rispondere quello che vuoi. Prima di fare il send controlla se il canale è ancora aperto.
    Ciao

  3. Ma come si fa a far inviare messaggi ad altre persone che non si trovano nella stessa rete locale lan?

  4. Ciao,
    perchè se questo codice lo applico all’interno di un servizio Windows non funziona? Si blocca al metodo AcceptSocket().
    Tale procedura è perfettamente funzionante in una WinForm.
    Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *