Salve, con questa guida vi spiegherò come creare una chat in locale ( che quindi funziona solo con l'IP 127.0.0.1 e con l'IP della vostra rete Intranet, più in la farò anche quella per la connessione con altri utenti ). Premetto che questa guida sarà strutturata in vari punti che successivamente verranno ampliati e spiegati, e come ambiente di sviluppo userò Visual Studio 2008 ( fanculo al Framework 4.0 e al Visual Studio 2010 ). Ecco i punti sui quali si baserà la guida :
Requisiti minimi
Strumenti del Form - Server
Strumenti del Form - Client
Disposizione degli strumenti sul Form - Server/Client
Creazione del Server + spiegazione
Creazione del Client + spiegazione
Download progetti Client - Server
Equivalente del codice in C# Client - Server
Crediti
Requisiti minimi
- Un briciolo di conoscenza del tipo di variabili
- Un briciolo di conoscenza dei Socket
- Buona volontà di apprendere e non di fare copia/incolla
- Pazienza
Strumenti del Form - Server
1 Bottone ( Button1 )
2 TextBox ( la seconda con proprietà Multiline = True )
2 Timer ( Timer1 & Timer2, intervallo = 100 )
Strumenti del Form - Client
2 Bottoni ( Button1 & Button2 )
3 TextBox ( la terza con proprietà Multiline = True )
3 Label ( Label1[IP LOCALE], Label2[INVIA DATI], Label3[DATI IN ARRIVO] )
1 Timer ( Timer1, intervallo = 100 )
Disposizione degli strumenti sul Form - Server/Client
Server
Client
Creazione del Server + spiegazione
Prima di tutto dobbiamo importare le classi che ci serviranno per lo scambio dei dati ( Socket ) e l'Encoding ( UTF8Encoding ), perciò all'inizio del programma scriveremo :
Adesso che abbiamo importato le classi che ci servono, dobbiamo creare le variabili che si occuperanno dell'ascolto ( TcpListener ), del client ( TcpClient ) e infine del flusso di dati ( NetworkStream ). Queste variabili vanno dichiarate sotto Public Class Form1 perchè serviranno per l'intero programma, e dato che sono delle variabili globali e non locali, sarebbe inutile scriverle ogni volta che vogliamo richiamarle. Quindi il codice sarà questo :
Adesso andiamo a programmare l'evento Load del Form1, nel quale imposteremo una porta sulla quale il TcpListener andrà ad ascoltare, permettendo quindi uno scambio di dati. Successivamente andremo ad avviare l'ascolto ( in attesa di connessioni ) e faremo partire il timer. Il tutto con questo codice :
NB : Come avete capito, la porta che ho inserito è una porta a caso e deve essere superiore a 1000 ( più o meno ) per poter far funzionare il programma.
Adesso visto che dopo aver messo in ascolto il Server abbiamo detto al programma che deve avviare il Timer2 andremo a programmare l'evento Tick del Timer1. Nel Timer non faremo altro che verificare se ci sono connessioni in attesa attraverso l'istruzione ascoltatore.Pending(). Quindi, se il server dovesse trovare una connessione in entrata stopperà il Timer e accetterà la connessione di chi si connette con l'istruzione cliente = ascoltatore.AcceptTcpClient(). Dal momento che la connessione è stata accettata, si può anche bloccare l'ascolto del TcpListener, anche perchè non ha senso tenerlo ancora in ascolto se la chat è solo per 1 utente. Dopo aver chiuso l'ascolto al TcpListener, i dati che sono arrivati devono essere elaborati in qualche modo no ? Quindi tramite l'istruzione flusso = cliente.GetStream() il programma prenderà il flusso di dati in entrata. Adesso che il programma ha preso il flusso di dati in entrata, facciamo partire il Timer1, il tutto con queste istruzioni :
Adesso andremo a programmare l'evento Tick del Timer1, nel quale verranno "elaborati" i dati ricevuti e visualizzati nella seconda TextBox. Il programma non fa altro che verificare se i dati che l'utente ha mandato sono maggiori di 0, se sono maggiori allora li legge ( partendo da 0 ovviamente ) e li visualizza nella TextBox2, il tutto con questo codice :
Adesso visto che siamo molto intelligenti da voler parlare con noi stessi ( e soprattutto per vedere se il programma funziona, andiamo a programmare il Bottone per inviare i dati al Client. Nel codice del bottone il programma non fa altro che creare un array di byte che saranno quelli da spedire al client encodati in UTF8 della TextBox1 e successivamente inviarli partendo da 0 fino a tutta la loro lunghezza.
NB : Per farvi capire meglio : se io nella TextBox1 scrivo "ciao" il programma metterà la parola "ciao" nell'array di byte e lo encoderà in UTF8, successivamente lo invierà partendo da 0, questo significa che la "c" vale 0, la "i" vale 1, la "a" vale 2 e la "o" vale 3, quindi in tutto verranno inviati 4 byte. Il tutto con questo codice :
Creazione del Client + spiegazione
Dopo aver creato il Server dobbiamo creare l'applicazione che servirà a connettersi ad essere, cioè il Client. Per fare questo dobbiamo importare le stesse classi che avevamo importato nel Server e cioè i Socket e l'encoding :
Come al solito questi Imports vanno al di sopra di tutto il codice che andremo a scrivere.
Se vi ricordate, quando abbiamo creato il Server abbiamo dichiarato delle variabili globali che erano il TcpClient, il TcpListener e il NetworkStream, ma nel Client a noi non serve un TcpListener, perchè ? Eh...è inutile no ? Cosa deve ascoltare il Client ? Nulla, difatti a noi servirà solo dichiarare una variabile che si occuperà del TcpListener e un'altra che si occuperò del flusso di dati da inviare e da ricevere :
Al solito, ricordatevi di mettere queste dichiarazioni sotto Public Class Form1
Adesso se vi ricordate, nel Server subito dopo queste dichiarazioni avevamo programmato l'evento Load del Form1, ma in questo caso non ce n'è bisogno, dobbiamo solo programmare il bottone per connetterci all'indirizzo IP 127.0.0.1 o 192.168.x.x ( per la vostra rete Intranet ). In particolar modo, quando andiamo a programmare l'evento Click del Button2 dobbiamo dire al programma che premendo il bottone dovrà essere creata una variabile che si occupa dei un indirizzo IP, ma l'indirizzo IP è una stringa, quindi con Net.IPAddress.TryParse(TextBox3.Text, indirizzo) convertiremo in IPAddress ( indirizzo IP ) quello che c'è nell'a TextBox3. Adesso però dobbiamo creare il TcpClient, voi direte : "ma lo abbiamo già creato quando lo abbiamo dichiarato", e io vi dico NO, LO ABBIAMO SOLO DICHIARATO, adesso deve essere richiamato, quindi dopo averlo richiamato con cliente = New TcpClient lo faremo connettere all'indirizzo IP sulla porta che avete scelto voi, che ricordo deve essere superiore a 1000 ( credo ) per poter funzionare. Adesso come facciamo a sapere se un utente ( cioè noi stessi lol ) si è connesso ? Attraverso una If il programma verificherà se il TcpClient è in connessione con il servere sulla porta xxxx e se è connesso scrive che L'utente si è connesso nella TextBox2, e se l'utente è connesso allora prende il flusso di dati che è in entrata e fa avviare il Timer1. Se l'utente non è connesso allora la connessione non sarà riuscita. Il tutto con questo codice :
Adesso si avvierà il Timer1, quindi andremo a programmare l'evento Tick del Timer1. Oh bene, in questo benedetto Timer...succederà la stessa cosa che è successa nel Server, ovvero che il programma verifica se i dati in entrata sono maggiori di 0 e se lo sono li legge partendo da 0 fino a tutta la lora lunghezza ( vedere l'esempio sopra fatto per quanto riguarda il Server ). Dopo averli letti li encoda in modo che possiamo leggerli, e successivamente li visualizza sulla TextBox2. Il tutto con questo codice :
Adesso vogliarmo comunicare con il Server...Lui ci scrive, noi rispondiamo. Quindi andremo a programmare il Button1. Se vi ricordate, per quanto riguarda il Server avevano dichiarato un'array di byte che prendeva i byte encodati da una delle TextBox. Dopo aver preso i dati, li scriveva partendo da 0 fino a tutta la loro lunghezza, bene qui succede la stessa cosa lol. Il tutto con questo codice :
Download progetti Client - Server
Download Server >
Download Client >
Equivalente del codice in C# Client - Server
Ebbene sì, mi sono messo a farlo anche in C# lol. Non cambia nulla, cambia solo l'encoding dei byte e l'invio, per il resto è uguale, se doveste avere problemi nella comprensione del codice chiedete.
Sorgente in C# del Server
Sorgente in C# del Client
Crediti
La guida è interamente mia, ho perso tempo per scriverla per voi ( ma anche per me per ripassarmi il codice ) affinchè possiate imparare ( se non sapete già farlo ) l'uso dei Socket e più o meno il "ragionamento" che fa il programma per inviare/ricevere/prendere i dati.
Saluti, System32









Requisiti minimi
- Un briciolo di conoscenza del tipo di variabili
- Un briciolo di conoscenza dei Socket
- Buona volontà di apprendere e non di fare copia/incolla
- Pazienza
Strumenti del Form - Server
1 Bottone ( Button1 )
2 TextBox ( la seconda con proprietà Multiline = True )
2 Timer ( Timer1 & Timer2, intervallo = 100 )
Strumenti del Form - Client
2 Bottoni ( Button1 & Button2 )
3 TextBox ( la terza con proprietà Multiline = True )
3 Label ( Label1[IP LOCALE], Label2[INVIA DATI], Label3[DATI IN ARRIVO] )
1 Timer ( Timer1, intervallo = 100 )
Disposizione degli strumenti sul Form - Server/Client
Server

Client

Creazione del Server + spiegazione
Prima di tutto dobbiamo importare le classi che ci serviranno per lo scambio dei dati ( Socket ) e l'Encoding ( UTF8Encoding ), perciò all'inizio del programma scriveremo :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso che abbiamo importato le classi che ci servono, dobbiamo creare le variabili che si occuperanno dell'ascolto ( TcpListener ), del client ( TcpClient ) e infine del flusso di dati ( NetworkStream ). Queste variabili vanno dichiarate sotto Public Class Form1 perchè serviranno per l'intero programma, e dato che sono delle variabili globali e non locali, sarebbe inutile scriverle ogni volta che vogliamo richiamarle. Quindi il codice sarà questo :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso andiamo a programmare l'evento Load del Form1, nel quale imposteremo una porta sulla quale il TcpListener andrà ad ascoltare, permettendo quindi uno scambio di dati. Successivamente andremo ad avviare l'ascolto ( in attesa di connessioni ) e faremo partire il timer. Il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
NB : Come avete capito, la porta che ho inserito è una porta a caso e deve essere superiore a 1000 ( più o meno ) per poter far funzionare il programma.
Adesso visto che dopo aver messo in ascolto il Server abbiamo detto al programma che deve avviare il Timer2 andremo a programmare l'evento Tick del Timer1. Nel Timer non faremo altro che verificare se ci sono connessioni in attesa attraverso l'istruzione ascoltatore.Pending(). Quindi, se il server dovesse trovare una connessione in entrata stopperà il Timer e accetterà la connessione di chi si connette con l'istruzione cliente = ascoltatore.AcceptTcpClient(). Dal momento che la connessione è stata accettata, si può anche bloccare l'ascolto del TcpListener, anche perchè non ha senso tenerlo ancora in ascolto se la chat è solo per 1 utente. Dopo aver chiuso l'ascolto al TcpListener, i dati che sono arrivati devono essere elaborati in qualche modo no ? Quindi tramite l'istruzione flusso = cliente.GetStream() il programma prenderà il flusso di dati in entrata. Adesso che il programma ha preso il flusso di dati in entrata, facciamo partire il Timer1, il tutto con queste istruzioni :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso andremo a programmare l'evento Tick del Timer1, nel quale verranno "elaborati" i dati ricevuti e visualizzati nella seconda TextBox. Il programma non fa altro che verificare se i dati che l'utente ha mandato sono maggiori di 0, se sono maggiori allora li legge ( partendo da 0 ovviamente ) e li visualizza nella TextBox2, il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso visto che siamo molto intelligenti da voler parlare con noi stessi ( e soprattutto per vedere se il programma funziona, andiamo a programmare il Bottone per inviare i dati al Client. Nel codice del bottone il programma non fa altro che creare un array di byte che saranno quelli da spedire al client encodati in UTF8 della TextBox1 e successivamente inviarli partendo da 0 fino a tutta la loro lunghezza.
NB : Per farvi capire meglio : se io nella TextBox1 scrivo "ciao" il programma metterà la parola "ciao" nell'array di byte e lo encoderà in UTF8, successivamente lo invierà partendo da 0, questo significa che la "c" vale 0, la "i" vale 1, la "a" vale 2 e la "o" vale 3, quindi in tutto verranno inviati 4 byte. Il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
IL SERVER E' STATO CREATO
Creazione del Client + spiegazione
Dopo aver creato il Server dobbiamo creare l'applicazione che servirà a connettersi ad essere, cioè il Client. Per fare questo dobbiamo importare le stesse classi che avevamo importato nel Server e cioè i Socket e l'encoding :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Come al solito questi Imports vanno al di sopra di tutto il codice che andremo a scrivere.
Se vi ricordate, quando abbiamo creato il Server abbiamo dichiarato delle variabili globali che erano il TcpClient, il TcpListener e il NetworkStream, ma nel Client a noi non serve un TcpListener, perchè ? Eh...è inutile no ? Cosa deve ascoltare il Client ? Nulla, difatti a noi servirà solo dichiarare una variabile che si occuperà del TcpListener e un'altra che si occuperò del flusso di dati da inviare e da ricevere :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Al solito, ricordatevi di mettere queste dichiarazioni sotto Public Class Form1
Adesso se vi ricordate, nel Server subito dopo queste dichiarazioni avevamo programmato l'evento Load del Form1, ma in questo caso non ce n'è bisogno, dobbiamo solo programmare il bottone per connetterci all'indirizzo IP 127.0.0.1 o 192.168.x.x ( per la vostra rete Intranet ). In particolar modo, quando andiamo a programmare l'evento Click del Button2 dobbiamo dire al programma che premendo il bottone dovrà essere creata una variabile che si occupa dei un indirizzo IP, ma l'indirizzo IP è una stringa, quindi con Net.IPAddress.TryParse(TextBox3.Text, indirizzo) convertiremo in IPAddress ( indirizzo IP ) quello che c'è nell'a TextBox3. Adesso però dobbiamo creare il TcpClient, voi direte : "ma lo abbiamo già creato quando lo abbiamo dichiarato", e io vi dico NO, LO ABBIAMO SOLO DICHIARATO, adesso deve essere richiamato, quindi dopo averlo richiamato con cliente = New TcpClient lo faremo connettere all'indirizzo IP sulla porta che avete scelto voi, che ricordo deve essere superiore a 1000 ( credo ) per poter funzionare. Adesso come facciamo a sapere se un utente ( cioè noi stessi lol ) si è connesso ? Attraverso una If il programma verificherà se il TcpClient è in connessione con il servere sulla porta xxxx e se è connesso scrive che L'utente si è connesso nella TextBox2, e se l'utente è connesso allora prende il flusso di dati che è in entrata e fa avviare il Timer1. Se l'utente non è connesso allora la connessione non sarà riuscita. Il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso si avvierà il Timer1, quindi andremo a programmare l'evento Tick del Timer1. Oh bene, in questo benedetto Timer...succederà la stessa cosa che è successa nel Server, ovvero che il programma verifica se i dati in entrata sono maggiori di 0 e se lo sono li legge partendo da 0 fino a tutta la lora lunghezza ( vedere l'esempio sopra fatto per quanto riguarda il Server ). Dopo averli letti li encoda in modo che possiamo leggerli, e successivamente li visualizza sulla TextBox2. Il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Adesso vogliarmo comunicare con il Server...Lui ci scrive, noi rispondiamo. Quindi andremo a programmare il Button1. Se vi ricordate, per quanto riguarda il Server avevano dichiarato un'array di byte che prendeva i byte encodati da una delle TextBox. Dopo aver preso i dati, li scriveva partendo da 0 fino a tutta la loro lunghezza, bene qui succede la stessa cosa lol. Il tutto con questo codice :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
IL CLIENT E' STATO CREATO
Download progetti Client - Server
Download Server >
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
Download Client >
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
Equivalente del codice in C# Client - Server
Ebbene sì, mi sono messo a farlo anche in C# lol. Non cambia nulla, cambia solo l'encoding dei byte e l'invio, per il resto è uguale, se doveste avere problemi nella comprensione del codice chiedete.
Sorgente in C# del Server
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Sorgente in C# del Client
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Crediti
La guida è interamente mia, ho perso tempo per scriverla per voi ( ma anche per me per ripassarmi il codice ) affinchè possiate imparare ( se non sapete già farlo ) l'uso dei Socket e più o meno il "ragionamento" che fa il programma per inviare/ricevere/prendere i dati.
Saluti, System32
Ultima modifica: