VB [GUIDA] Connettere il client al server con i sockets in vb.net

Stato
Discussione chiusa ad ulteriori risposte.
coff coff guarda che c'è parecchio di sbagliato, sono luoghi comuni senza supporto di documentazione, poi che sfiga, hai preso proprio TeamViewer che è l'esempio sbagliato XD
TeamViewer è gratuito per uso personale... ma hehe a tempo limitato (sorpresina!). Io l'ho usato per un paio di giorni, poi iniziano a spuntare fuori messaggi che dicono che è usato troppo e si chiude. Anche a distanza di giorni, perchè memorizza l'utilizzo in locale.
Pertanto anche TeamViewer alla fine dei conti è un 100% trial e un finto free.
Sul vendo/regalo, non esiste il problema. Chi vende non obbliga nessuno ad acquistare, chi regala non obbliga nessuno ad utilizzare. Se chi vende è superiore a chi regala ci saranno dei macro motivi :-)

Veramente io ho TeamViewer da + di un anno su ben 3 computer e non mi è mai spuntato alcun messaggio in nessun computer O.o

Mo me la pappo tutta!!
Sei stato bravo, e ti meriti il rilievo!


Funge alla stragrande, bravissimo :D

Grazie ;-)

@Whivel --> si è vero che sarebbe più sensato scrivere Dim x() As Byte ma se poi scrivo Array.Resize(x, x.length + 1) sei sicuro che non mi restituisca un'eccezione?
 
Speed mi da' errore quando provo a connettermi col client e il server è off, sai come gestire l eccezione?
 
Ultima modifica:
Infatti Vb.Net non vuole la lunghezza dell'array come parametro, ma "l'indice dell'ultimo elemento". Quindi dire (0) significa dire che c'è un elemento con indice 0

--- Aggiornamento Post ---

per fare un array vuoto sarebbe più sensato non mettere niente come parametro:
dim x() as byte

Hai ragione, in effetti sono io che ho fatto un po' di confusione. Fate come se non avessi detto nulla...

--- Aggiornamento Post ---

Speed mi da' errore quando provo a connettermi col client e il server è off, sai come gestire l eccezione?

Dovrebbe bastare un Try ... Catch.
 
Hai ragione, in effetti sono io che ho fatto un po' di confusione. Fate come se non avessi detto nulla...

--- Aggiornamento Post ---



Dovrebbe bastare un Try ... Catch.

ihihih :asd: tranquillo non abbiamo letto niente xD
Comunque si basta un Try Catch
l'eccezione in particolare dovrebbe essere SocketException.
Quindi:
Try
'istruzioni dove si verifica l'eccezione
Catch ex As SocketException
MsgBox("Il server è off!")
End Try
 
Veramente io ho TeamViewer da + di un anno su ben 3 computer e non mi è mai spuntato alcun messaggio in nessun computer O.o
ma questi computer sono in rete o in internet? Perchè ti giuro che a me esce il messaggio che secondo loro è usato per scopi commerciali e dopo un po chiudono la connessione. Forse perchè ho ip statico
 
ma questi computer sono in rete o in internet? Perchè ti giuro che a me esce il messaggio che secondo loro è usato per scopi commerciali e dopo un po chiudono la connessione. Forse perchè ho ip statico

Si è probabile che sia dovuto all'ip. L'ip statico non viene utilizzato solitamente dagli utenti normali. Comunque è strano (sicuro che all'installazione non hai inserito per sbaglio scopi commerciali o entrambi???) TeamViewer è gratuito per i privati e senza limitazioni.
Altre cose che potrebbero aver fatto "pensare" a TeamViewer che lo usi per scopi commerciali sono le troppe assistenze che hai effettuato (se ne hai effettuate molte).
Comunque io ho un Router a cui è connesso il mio portatile (che è il pc che uso sempre) con TeamViewer e il fisso di mio padre senza TeamViewer. Poi gli altri 2 pc sono un portatile di mia madre che connette solo quando va a lavoro alla rete dell'azienda (ma possiede solo lei TeamViewer), e l'altro è il portatile di mio padre che utilizzo 1 volta all'anno al massimo e solo quando esco per brevi periodi, quindi non lo collego mai al mio router di casa.
Altro fattore potrebbe essere se hai installato TeamViewer su più di un computer connessi alla stessa rete locale, che quindi TeamViewer si accorge che nella tua rete ci sono altri computer con TeamViewer e la prende come se fosse la rete Intranet di un'azienda dove più lavoratori hanno TeamViewer preso come se fossero privati.
Ti posso dare queste soluzioni:
1-(solo se hai più di un computer con TeamViewer e sono connessi alla stessa rete locale) Puoi provare a disinstallare TeamViewer da tutti i computer e poi a re-installarlo solo su una macchina per uso esclusivamente privato. Magari poi smette di dirti che lo usi per scopi commerciali.
2-Vai sul sito e chiedi assistenza.
 
Speed, mi spieghi come fare bene il multi-connect?
non riesco a risolvere ç_ç
 
Quelli che hai desritto tu: il server che ti risponde e il doppio messaggio!
Help!
 
Ultima modifica:
Dovresti capirlo:
Nella parte del codice del server dove re-invii il messaggio a tutti i client basta modificare il seguente codice:
Codice:
[FONT=Consolas][COLOR=blue]For[/COLOR] s = 0 [COLOR=blue]To[/COLOR] UBound(cliente) [COLOR=green]'Per ogni client connesso...[/COLOR][/FONT]
  [FONT=Consolas]                    flusso(s).Write(temp, 0, temp.Length) [COLOR=green]'Scrivo nel flusso di dati (flusso(s)) che è il flusso che arriva a tutti i client, ciò che è contenuto in temp. ovvero invio a flusso(0) che è il flusso che arriva a cliente(0). poi flusso(1) che arriva a cliente(1) e così via...[/COLOR][/FONT]
  [FONT=Consolas] [COLOR=blue]Next[/COLOR] [COLOR=green]'poi[/COLOR][/FONT]
In questo:
Codice:
[FONT=Consolas][COLOR=blue]For[/COLOR] s = 0 [COLOR=blue]To[/COLOR] UBound(cliente) [COLOR=green]'Per ogni client connesso...[/COLOR][/FONT]

  [FONT=Consolas]                    If Not cliente(s) = cliente(r) Then flusso(s).Write(temp, 0, temp.Length) [COLOR=green]'Scrivo nel flusso di dati (flusso(s)) che è il flusso che arriva a tutti i client, ciò che è contenuto in temp. ovvero invio a flusso(0) che è il flusso che arriva a cliente(0). poi flusso(1) che arriva a cliente(1) e così via...[/COLOR][/FONT]
  [FONT=Consolas] [COLOR=blue]Next[/COLOR] [COLOR=green]'poi[/COLOR][/FONT]
(ovviamente non testato :D)
Cioè controlla semplicemente se quello a cui stai per re-inviare il messaggio è lo stesso che ha scritto il messaggio.
e se è lo stesso non lo invia.
Per la parte della scritta server te lo spiego domani (ora devo finire di studiare)...se faccio presto anche più tardi. Intanto provaci da solo (dovrai fare modifiche anche nel client) ;-)
 
Ho provato a inviare un flusso ID per il server e per il cliente, solo che come faccio a fargli capire qual'è quello giusto???
 
Ho provato a inviare un flusso ID per il server e per il cliente, solo che come faccio a fargli capire qual'è quello giusto???

Capire qual'è quello giusto? che intendi?
Cioè a quale cliente deve associare l'ID il server?
Se k è un numero intero e il messaggio arriva da flusso(k), significa che è stato inviato da cliente(k). Non so se riesci a capire cosa intendo.
Comunque spiega meglio cosa intendi e più nel dettaglio cosa vuoi fare.
Vuoi semplicemente che il server attribuisca un ID (0,1,2,3..) al client che scrive e poi lo invii agli altri client mostrando semplicemente quell'ID o vuoi che i vari client possano scegliersi i loro ID personali e il server dovrà poi associare ad ogni cliente(k) l'ID scelto dallo stesso cliente(k) e invii agli altri client il messaggio con quell'ID scelto?
E' difficile spiegare questi ragionamenti xD.
 
Speed, rispondo per chiudere il quesito sul TeamViewer, si ne ho fatto un buon uso, penso sia un insieme di tempo di utilizzo+ip statico.
 
Speed, rispondo per chiudere il quesito sul TeamViewer, si ne ho fatto un buon uso, penso sia un insieme di tempo di utilizzo+ip statico.

è probabile.
Appunto se sono questi i problemi e ti serve strettamente TeamViewer puoi contattare il support di TeamViewer.
@error --> Ho finito di studiare ora provo a risolvere i problemini poi posto il codice.

--- Aggiornamento Post ---

E wualla fatto non ci è voluto niente :D
Allora. Va modificato sia il client che il server
Server:
Timer1.Tick diventa:
Codice:
For r = 0 To UBound(cliente) 'Per ogni client connesso (contenuto in cliente)...
            If cliente(r).Available > 0 Then 'Se i dati che ricevi dal cliente che stai controllando (cliente(r)) sono maggiori di 0 e sono disponibili per la lettura allora...
                Dim temp(cliente(r).Available - 1) As Byte 'Dichiaro un array con dimensioni uguali al numero di dati ricevuti da cliente(r) meno 1
                flusso(r).Read(temp, 0, temp.Length) 'Leggo il flusso di dati (flusso(r)) che è il flusso di dati inviato da cliente(r), e metto questi dati dentro all'array temp (byte per byte) per tutta la loro dimensione
                Dim testo As String = UTF8.GetString(temp) 'Decodifica temp in stringa UTF8 e mettila in testo
                TextBox2.Text = TextBox2.Text & testo & vbCrLf 'Scrivo nella TextBox2
                For s = 0 To UBound(cliente) 'Per ogni client connesso...
                    If Not cliente(s).Equals(cliente(r)) Then flusso(s).Write(temp, 0, temp.Length) 'Scrivo nel flusso di dati (flusso(s)) che è il flusso che arriva a tutti i client, ciò che è contenuto in temp. ovvero invio a flusso(0) che è il flusso che arriva a cliente(0). poi flusso(1) che arriva a cliente(1) e così via...
                Next 'poi
            End If 'Fine se
        Next 'poi

Client:
Dopo aver aggiunto una TextBox (TextBox4) che conterrà l'ID scelto dall'utente:
Timer1.Tick diventa:
Codice:
If cliente.Available > 0 Then 'Se i dati che ricevi dal server al quale è connesso cliente sono disponibili e sono maggiori di 0
            Dim temp(cliente.Available - 1) As Byte 'Dichiaro un array con dimensioni uguali al numero di dati ricevuti da cliente meno 1
            flusso.Read(temp, 0, temp.Length) 'Leggo il flusso di dati
            Dim testo As String = UTF8.GetString(temp) 'Decodifica temp in stringa UTF8 e mettila in testo
            TextBox3.Text = TextBox3.Text & testo & vbCrLf 'Scrivo nella TextBox3
        End If 'Fine se
Button2.Click diventa:
Codice:
TextBox3.Text = TextBox3.Text & "Io: " & TextBox2.Text & vbCrLf 'Scrivo nella TextBox3
        Dim temp() As Byte = UTF8.GetBytes(TextBox4.Text + ": " + TextBox2.Text) 'Decodifica la stringa in TextBox2 in bytes e metti ogni byte nell'array temp
        flusso.Write(temp, 0, temp.Length) 'Scrivi il flusso di dati
        TextBox2.Text = "" 'Cancello testo
        TextBox2.Focus() 'Attivo TextBox2
Lascio a te scoprire le modifiche che ho fatto ;) sono poche
 
il client non ha cognizione se il server accetta le richieste di 20 client o 1 solo.... per ognuno di essi c'è una connessione tra processo client e processo server (questo si ha grazie allo stack di protocolli di rete).
Comunque ogni client vede il server come se fosse collegato solo con lui (quindi nel client non cambia nulla). Il server cambia perché deve gestire più connessioni
 
il client non ha cognizione se il server accetta le richieste di 20 client o 1 solo.... per ognuno di essi c'è una connessione tra processo client e processo server (questo si ha grazie allo stack di protocolli di rete).
Comunque ogni client vede il server come se fosse collegato solo con lui (quindi nel client non cambia nulla). Il server cambia perché deve gestire più connessioni

Ancora non capisco se teck intende nella differenza tra la connessione singola e la multiconnessione o per quei problemini che mi ha chiesto error di risolvere.
Nel primo caso è come dice Whivel: il client si connette solo al server, è il server che si connette a più client ma il client non sa nemmeno a quanti altri client è connesso il server.
Nel secondo caso: Ho cambiato delle cose anche nel client nella scrittura della TextBox3 e nell'invio del messaggio.
 
Grazie mille Speed, poi vedo il codice, sto pomeriggio!

--- Aggiornamento Post ---

scusa, ma se non ho la porta aperta non va!
Come faccio ad aprire/chiudere le porte???
 
Puoi usare portmap oppure accedere alla configurazione del tuo router.
puoi entrarci scrivendo uno dei seguenti nella barra degli indirizzi del tuo browser (solitamente sono questi):
-192.168.1.1
-192.168.1.0
-192.168.0.0
-192.168.0.1
-Oppure puoi inserire il nome host che hai scelto su DynDNS e dovresti arrivare alla configurazione del router.
Di solito l'id e la password di accesso sono Admin, Admin.
Cerca la parte della configurazione per l'inoltro delle porte come ho spiegato anche nella guida.
 
Stato
Discussione chiusa ad ulteriori risposte.
Indietro
Top Bottom