Darkos (Normal User)
Newbie
Messaggi: 19
Iscritto: 11/01/2010
|
Salve a tutti.
Vorrei realizzare una piccola chat in C# Client/Server.
Visto che mi hanno sconsigliato più volte il WinSock di Win vorrei sapere come utilizzare queste classi in .Net
La cosa che trovo strana è come sia possibile che per controllare l'arrivo di dati ci sia bisogno di un timer.. non occuperebbe troppa memoria?
O magari esiste un modo per creare degli handler?
In più volevo sapere se avete una guida da consigliarmi.. fin ora sono riuscito solo ad aprire il Listner, visto che mi sembra strano che devo mettere un timer per controllare se arrivata una richiesta di connessione
Grazie Mille
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
In che senso? Cosa hai usato? Cosa hai scritto?
Con la classe TcpListener crei un server che ascolta e con il metodo AcceptTcpClient attendi e accetti una connessione da un client ... cosa c'entra il timer?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Darkos (Normal User)
Newbie
Messaggi: 19
Iscritto: 11/01/2010
|
Ho scritto solo un tasto che al click mi apre il listner, non riesco ad andare avanti
Il punto è che mi serve un evento sotto il quale ci metto AcceptTcpClient
Non posso mica mettere un timer start e stop ogni volta che voglio controllare se arriva la richiesta.. e se arrivano dati ad esempio.. proprio questo è il mio dubbio.. come?
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Te l'ho fatto notare nell'altra discussione:
Postato originariamente da Darkos:
E come faccio senza gli eventi o_O?
Esempio.. al posto di un dataarrival mica ci posso mettere un timer che controlla se arriva il data! |
Invece si usa proprio questo... Dopotutto cosa fa il componente winsock se non guardare ogni tot che non ci siano dati in arrivo?
Listener.Pending() restituisce True se c'è una richiesta in attesa. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da Darkos:
Ho scritto solo un tasto che al click mi apre il listner, non riesco ad andare avanti
|
Hai diverse soluzioni ... la prima, come ti è stato detto da Totem, è controllare periodicamente l'arrivo di una connessione tramite la Pending (con un timer oppure, meglio, all'interno di un apposito thread in un ciclo).
La seconda, come ti avevo suggerito, è quella di usare il metodo AcceptTcpClient per attendere l'arrivo di una connessione. Dato che il metodo AcceptTcpClient è "bloccante", dovrai usare necessariamente un altro thread ma eviterai loop e timer (userai solo una Sleep).
La terza, è quella di usare metodi "asincroni" come BeginAcceptTcpClient ed EndAcceptTcpClient tramite i quali puoi creare effettivamente un evento che viene chiamato in maniera asincrona quando si verifica la connessione.
Ma questo metodo è un po' piu' complesso da usarsi e se non hai un po' d'esperienza ti consiglio gli altri.
Il metodo AcceptTcpClient mi sembra la migliore soluzione anche perchè il programma del tipo che stai scrivendo, presuppone l'uso del multithreading ...
Ultima modifica effettuata da nessuno il 30/01/2010 alle 11:07
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Darkos (Normal User)
Newbie
Messaggi: 19
Iscritto: 11/01/2010
|
Grazie mille, funziona
Il punto è che funziona solo con un solo TcpListener ed un solo client.
Per creare una chat fra più utenti come posso fare?
Vorrei che i client si connettessero ad un server..
Ho provato con un array di TcpListener però mi da errore, mi dice che non è possibile trasformarlo in matrice
Avete delle idee? O meglio, sapete come posso fare?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da Darkos:
Grazie mille, funziona
Il punto è che funziona solo con un solo TcpListener ed un solo client. |
Funziona ... cosa? Quale soluzione ?
In ogni caso, una volta che è stata accettata la connessione con un nuovo client, devi passare l'oggetto client ad un altro thread per gestire la comunicazione e creare una nuova istanza di client per attendere una nuova connessione.
Se non hai molta pratica con la programmazione multithreading, non potrai scrivere facilmente questo tipo di programmi ... te l'avevo gia' detto ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Darkos (Normal User)
Newbie
Messaggi: 19
Iscritto: 11/01/2010
|
Ho fatto un timer con Listener.Pending() e funziona, si connette
Comunque ok, prima però devo imparare i thread
Non mi prendere in giro, non ho mai avuto bisogno di essi
Percaso c'hai una guida da consigliarmi online?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da Darkos:
Ho fatto un timer con Listener.Pending() e funziona, si connette |
Secondo me, erano meglio gli altri metodi ... comunque ...
Comunque ok, prima però devo imparare i thread |
Esatto
Non mi prendere in giro, non ho mai avuto bisogno di essi |
E chi ti prende in giro? Sono serio ...
Percaso c'hai una guida da consigliarmi online? |
E su cosa? Ti sconsiglio le guide online ... studia dai libri ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|