• 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!

Release Simple Chat System.

TBH

Utente Master
Autore del topic
24 Dicembre 2012
2.134
115
Miglior risposta
0
Questo oggi vedremo come realizzare una semplice chat utilizzando i socket.

L'applicazione in questione è la seguente

d453e040b51a6eb0d9ce3439ce26e7e3


L'applicazione Console Application è il server con il log dei messaggi inviati e degli user connessi e disconnessi.
I Vari Client sono le finestre provviste di due textbox (una per il nickname e l'altra per il messaggio) , di una listbox dove si aggiornano i vari client connessi e infine il Button per inviare il messaggio scritto dall'utente.

Iniziamo descrivendo brevemente il concetto di client-server partendo da un immagine :

35ch8qo.jpg

Nell'immagine si notano i vari pc (denominati client) collegati a sua volta a un server che si occupa di gestire il trasferimento dati in maniera peer-to peer(paritetica), nel nostro caso quel "server" può essere interpretato come un hub dato che invierà i dati a tutti i client connessi.

Creeremo un applicazione server (che gestirà più client) e che generalmente si comporterà come un hub (quindi invierà i dati a tutti) e ovviamente il client.

Iniziamo ad analizzare il server , che è una ConsoleApplication

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Passiamo alla classe User.vb

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Infine la classe Server.vb

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Poll

Mi soffermo solo su Poll , che l'ho adoperata per vedere se l'utente effettivamente è ancora connesso. Questo metodo accetta due parametri il primo sono i Millisecondi d'attesa per verificare e il secondo parametro rappresenta cosa verificare.
Questo metodo determina lo stato del socket

SelectMode.SelectRead :
restituisce :
true se è stato chiamato il metodo Listen e vi è una connessione in sospeso;
-oppure-
true se sono disponibili dati per la lettura
-oppure-
true se la connessione è stata chiusa, ripristinata o terminata.
In caso contrario, restituisce false.

Per altre informazioni visita :
Perfavore, Entra oppure Registrati per vedere i Link!



Passiamo al client :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


Passiamo alla classe Client

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


Ed ecco il link per il download :
Perfavore, Entra oppure Registrati per vedere i Link!
 
Ultima modifica:
  • Like
Reactions: 1 person
@TBH ma usare checkforillegalcrossthread non è sicuro , è meglio usare i delegate secondo me... opinioni ?
 
@TBH ma usare checkforillegalcrossthread non è sicuro , è meglio usare i delegate secondo me... opinioni ?

ovvio è sconsigliatissimo bravo patpat, ho lasciato alcune cose incomplete per farvi partecipare :soso:
se hai notato la chat dovrebbe implementare anche il mex privato , c'è anche il metodo già fatto nella classe server ma è marcato con un annotazione come Obsolete
 
Buona spiegazione, anche se personalmente avrei fatto prima la differenza tra i socket sincroni e i socket asincroni. Un accorgimento :

client.BeginReceive(New Byte() {0}, 0, 0, SocketFlags.None, New AsyncCallback(AddressOf receive), Nothing)

Non serve specificare tutti gli argomenti. Il primo ad esempio è un indicatore di posizione di archiviazione dei byte che, se non specificato, è uguale a 0. Sai come sono, è banale come cosa se si sa non fa male. Del CheckForIllegalCrossThread se n'è parlato. Ultima cosa, questa è importante. Io utilizzerei sempre, quando si parla di Socket, la classe ManualResetEvent. Quando iniziai ad utilizzare i socket asincroni diventai pazzo...non capivo come gestirli e non capivo perché certi metodi si bloccavano, poi scoprii quella classe e mi si aprirono gli occhi. Mi salvò il culo ahah
 
Ultima modifica:
si la differenza sostanziale e nell'uso del thread differente e al responso dell'operazione ....
Riguardo alla chiamata é vero ma anche usando il metodo ridefinito(in cui sono assenti determinati argomenti) chiami inevocabilmente quello con tutti i parametri.
Riguardo al ManuelResetEvent (somigliante molto al concetto di wait e notify in java) rimango scettico nel utilizzarlo in questo caso perché posso crearmi io l'evento , lanciarlo (associandoci giustamente il suo gestore ) e successivamente terminare l'operazione asincrona o in precedenza poco cambia ,evitando inutili stalli che si creano nel caso di una mancata terminazione di un metodo asincrono
Esistono anche altri metodi per svilupparlo , per esempio ottenere i dati del operazione asincrona direttamente dall'interfaccia AsyncResult (ovviamente usando un cast)e terminare usano il rispettivo endMetodo. @System32
Inviato dal mio DAWAY Z6 utilizzando Tapatalk
 
Ultima modifica: