• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Creare una chat in locale

System32

Utente Stellare
Autore del topic
2 Gennaio 2010
15.556
112
Miglior risposta
0
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 :

29e6upv.png
Requisiti minimi

29e6upv.png
Strumenti del Form - Server

29e6upv.png
Strumenti del Form - Client

29e6upv.png
Disposizione degli strumenti sul Form - Server/Client

29e6upv.png
Creazione del Server + spiegazione

29e6upv.png
Creazione del Client + spiegazione

29e6upv.png
Download progetti Client - Server

29e6upv.png
Equivalente del codice in C# Client - Server

29e6upv.png
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

119b32w.png


Client

kagdl.png


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:
Riferimento: Creare una chat in locale

Quanto ci hai messo :shock: ? Comunque di queste guide in giro nel web se ne trovano.
Complimenti appena posso creo il progetto ;)
 
Riferimento: Creare una chat in locale

Quanto ci hai messo :shock: ? Comunque di queste guide in giro nel web se ne trovano.
Complimenti appena posso creo il progetto ;)

Approposito di progetto...Mi sono dimenticato di allegare entrami i progetti, li aggiungo.
 
Riferimento: Creare una chat in locale

Ecco cosa confabulavi ieri xD Bravo come sempre,credo che servirà ai principianti..
 
Riferimento: Creare una chat in locale

E più che altro un inizio per capire i Socket, niente di che. Alla fine è tutto inglese.
 
Riferimento: Creare una chat in locale

.....complimenti , appena ho tempo lo metto nel mio sito!
 
Riferimento: Creare una chat in locale

La si può creare anche con il Dos, ma d'altronde hai fatto una buona guida, è ben organizzata e l'hai abbellita bene
 
Riferimento: Creare una chat in locale

No, ma tu sei un grande.
Ottima guida, ben spiegata ed ordinata.

Complimenti Ale.
:emoji_slight_smile:
 
Riferimento: Creare una chat in locale

bella, potevi aggiungere particolari ma sempre bravo!
 
Riferimento: Creare una chat in locale

salve ragazzi ho un problema nella versione C#....quando scrivo a me stesso sul server mi viene un errore nella seconda riga del button flusso.Write(invia, 0, invia.Length);
e mi viene NullReferenceException was unhandled
riferimento a un oggetto non impostato su un'istanza di oggetto.
Come posso risolvere???help me pls
 
Ultima modifica:
Riferimento: Creare una chat in locale

salve ragazzi ho un problema nella versione C#....quando scrivo a me stesso sul server mi viene un errore nella seconda riga del button flusso.Write(invia, 0, invia.Length);
e mi viene NullReferenceException was unhandled
riferimento a un oggetto non impostato su un'istanza di oggetto.
Come posso risolvere???help me pls
Per avere una completa assistenza ti consiglio di postare il problema nell'apposita sezione: Assistenza Tecnica ;)
 
Riferimento: Creare una chat in locale

Grandei system , mi serviva tantissimo questa guida e non la trovavo da nessuna parte!
Di guide così dettagliate se ne trovano pochissime!
Complimenti!