Usare le Socket in VB.NET
Pagina 1 su1 • Condividere •
Usare le Socket in VB.NET
La classe System.Net.Sockets offre funzionalità per gestire la comunicazione tra due computer in rete. In questo capitolo ci soffermeremo sull'analisi dei metodi di comunicazione tramite TCP (Trasmissione Control Protocol).
Server
Il server, nel nostro caso, è il computer sul quale risiede l'applicazione principale deputata alla gestione delle connessioni e dei servizi dei client esterni. Più in generale è una componente informatica che fornisce servizi ad altre componenti attraverso una rete.
Per implementare un'applicazione Server da codice dobbiamo far sì che essa possa accettare connessioni da parte di altri. Per far questo è necessario usare la classe TcpListener, che si mette in ascolto su di una porta, e riferisce quando ci sono richieste di connessioni in attesa su di essa.
Codice sorgente
Public Listener As New Sockets.TcpListener(25)
Questa riga di codice inizializza un TcpListener sulla porta 25 (quella di default per i server di posta
). I metodi che comunicano ad esso di iniziare o terminare l'ascolto sono Start() e Stop(), mentre la funzione che comunica se ci sono richieste in attesa di essere accettate è Pending() (restituisce un valore Booleano). Per accettare la connessione è necessario richiamare la funzione AcceptTcpClient(), la quale restituisce un oggetto di tipo TcpClient connesso al rispettivo oggetto sul Client. In questo modo, Server e Client risultano legati da una connessione.
Client
La classe fondamentalmente usata per un client è TcpClient. I suoi membri più significativi sono:
* Avaiable: restituisce il numero di bytes ricevuti e pronti per la lettura
* Close: chiude la connessione
* Connect(IP, P): tenta una connessione verso il server identificato da IP sulla porta P. IP può essere sia un indirizzo IP che DNS
* Connected: restituisce True se è connesso, altrimento False
* GetStream: funzione importantissima che restituisce un oggetto di tipo Sockets.NetworkStream su cui e da cui si scrivono e leggono tutti i dati scambiati tra client e server
* ReceiveBufferSize: imposta la grandezza del buffer di bytes ricevuti
* SendBufferSize: imposta la grandezza del buffer di bytes inviati
Costruire l'applicazione
Le classi TcpListener e TcpClient non possiedono eventi, perciò, per sapere quando ci sono connessioni in attesa o se si sono ricevuti dati, è necessario controllare con un timer. Chiameremo tmrControlConnection il timer che controlla se ci sono richieste di connessione sul Server, mentre tmrGetData quello che controlla la presenza di dati ricevuti. Ci sarà poi un pulsante cmdSend per inviare dati e una textbox txtSend contenente il messagio da inviare. Cominciamo a scrivere.
Solo per il server:
Codice sorgente
Imports System.Net.Sockets
Public Listener As New TcpListener(25)
Private Sub tmrControlConnection_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrControlConnection.Tick
'Se ci sono connessioni in attesa
If Listener.Pending Then
'Inizializza il client
Client = Listener.AcceptTcpClient
'Inizializza lo stream
NetStr = Client.GetStream
'Termina il controllo del timer
tmrControlConnection.Stop()
'Termina l'ascolto del TcpListener
Listener.Stop()
'Attiva il timer per la ricezione di dati
tmrGetData.Start()
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Esiste anche una versione di Start che accetta come parametro
'il massimo numero di connessioni accettabili
Listener.Start()
End Sub
Per server e client:
Codice sorgente
Public Client As TcpClient
Public NetStr As NetworkStream
Private Sub tmrGetData_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrGetData.Tick
'Se il client è connesso
If Client.Connected Then
'Se ci sono dati da leggere, che possono essere letti
If Client.Available > 0 And NetStr.CanRead Then
'Legge i dati come array di bytes
Dim Bytes(Client.ReceiveBufferSize) As Byte
'Legge Client.ReceiveBufferSize bytes a partire dal primo
'dallo stream e li deposita in Bytes
'se ci sono bytes nulli, non verranno contati
'di default, Client.ReceiveBufferSize = 8129
NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
'Trasforma i bytes ricevuti in stringa
Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
'Visualizza il messaggio
MsgBox(S, MsgBoxStyle.Information)
End If
End If
End Sub
Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click
'Se il client è connesso
If Client.Connected Then
'Se si può scrivere sullo stream
If NetStr.CanWrite Then
'Converte il messaggio in bytes
Dim Bytes() As Byte = _
System.Text.ASCIIEncoding.ASCII.GetBytes(txtSend.Text)
'E li scrive sullo stream
NetStr.Write(Bytes, 0, Bytes.Length)
End If
End If
End Sub
Solo per il client:
Codice sorgente
Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
'Prova a connettersi al server
Client.Connect("127.0.0.1", 25)
'Se è avvenuta la connessione
If Client.Connected Then
'Inizializza lo stream
NetStr = Client.GetStream
End If
End Sub
127.0.0.1 è il localhost, ossia la stessa macchina su cui viene eseguito il software.
Scritto da: Totem
Server
Il server, nel nostro caso, è il computer sul quale risiede l'applicazione principale deputata alla gestione delle connessioni e dei servizi dei client esterni. Più in generale è una componente informatica che fornisce servizi ad altre componenti attraverso una rete.
Per implementare un'applicazione Server da codice dobbiamo far sì che essa possa accettare connessioni da parte di altri. Per far questo è necessario usare la classe TcpListener, che si mette in ascolto su di una porta, e riferisce quando ci sono richieste di connessioni in attesa su di essa.
Codice sorgente
Public Listener As New Sockets.TcpListener(25)
Questa riga di codice inizializza un TcpListener sulla porta 25 (quella di default per i server di posta
Client
La classe fondamentalmente usata per un client è TcpClient. I suoi membri più significativi sono:
* Avaiable: restituisce il numero di bytes ricevuti e pronti per la lettura
* Close: chiude la connessione
* Connect(IP, P): tenta una connessione verso il server identificato da IP sulla porta P. IP può essere sia un indirizzo IP che DNS
* Connected: restituisce True se è connesso, altrimento False
* GetStream: funzione importantissima che restituisce un oggetto di tipo Sockets.NetworkStream su cui e da cui si scrivono e leggono tutti i dati scambiati tra client e server
* ReceiveBufferSize: imposta la grandezza del buffer di bytes ricevuti
* SendBufferSize: imposta la grandezza del buffer di bytes inviati
Costruire l'applicazione
Le classi TcpListener e TcpClient non possiedono eventi, perciò, per sapere quando ci sono connessioni in attesa o se si sono ricevuti dati, è necessario controllare con un timer. Chiameremo tmrControlConnection il timer che controlla se ci sono richieste di connessione sul Server, mentre tmrGetData quello che controlla la presenza di dati ricevuti. Ci sarà poi un pulsante cmdSend per inviare dati e una textbox txtSend contenente il messagio da inviare. Cominciamo a scrivere.
Solo per il server:
Codice sorgente
Imports System.Net.Sockets
Public Listener As New TcpListener(25)
Private Sub tmrControlConnection_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrControlConnection.Tick
'Se ci sono connessioni in attesa
If Listener.Pending Then
'Inizializza il client
Client = Listener.AcceptTcpClient
'Inizializza lo stream
NetStr = Client.GetStream
'Termina il controllo del timer
tmrControlConnection.Stop()
'Termina l'ascolto del TcpListener
Listener.Stop()
'Attiva il timer per la ricezione di dati
tmrGetData.Start()
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Esiste anche una versione di Start che accetta come parametro
'il massimo numero di connessioni accettabili
Listener.Start()
End Sub
Per server e client:
Codice sorgente
Public Client As TcpClient
Public NetStr As NetworkStream
Private Sub tmrGetData_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrGetData.Tick
'Se il client è connesso
If Client.Connected Then
'Se ci sono dati da leggere, che possono essere letti
If Client.Available > 0 And NetStr.CanRead Then
'Legge i dati come array di bytes
Dim Bytes(Client.ReceiveBufferSize) As Byte
'Legge Client.ReceiveBufferSize bytes a partire dal primo
'dallo stream e li deposita in Bytes
'se ci sono bytes nulli, non verranno contati
'di default, Client.ReceiveBufferSize = 8129
NetStr.Read(Bytes, 0, Client.ReceiveBufferSize)
'Trasforma i bytes ricevuti in stringa
Dim S As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)
'Visualizza il messaggio
MsgBox(S, MsgBoxStyle.Information)
End If
End If
End Sub
Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click
'Se il client è connesso
If Client.Connected Then
'Se si può scrivere sullo stream
If NetStr.CanWrite Then
'Converte il messaggio in bytes
Dim Bytes() As Byte = _
System.Text.ASCIIEncoding.ASCII.GetBytes(txtSend.Text)
'E li scrive sullo stream
NetStr.Write(Bytes, 0, Bytes.Length)
End If
End If
End Sub
Solo per il client:
Codice sorgente
Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
'Prova a connettersi al server
Client.Connect("127.0.0.1", 25)
'Se è avvenuta la connessione
If Client.Connected Then
'Inizializza lo stream
NetStr = Client.GetStream
End If
End Sub
127.0.0.1 è il localhost, ossia la stessa macchina su cui viene eseguito il software.
Scritto da: Totem

Andrea- Admin
- Messaggi: 22
Data d'iscrizione: 05.09.08
Età: 17

Permesso del forum:
Non puoi rispondere agli argomenti in questo forum



