Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Client/Server - Inviare file
Forum - C# / VB.NET - [VB.NET] Client/Server - Inviare file - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 12:34
Sabato, 18/07/2009
Ok ma non ho capito come vada specificata la lunghrzza del file da inviare.

il discorso, a mio parere, è stato un po ingarbugliato, o almeno per uno che nn ne sa molto, quindi per chiarire le cose a me e ad eventuali altri utenti

metodo di riseofapocalypse:

dialogo tra client e server -> si salva una variabile che specifica se sta per inviare un file o stringa

e si invia il file:
Dim bytes() as byte = IO.File.ReadAllBytes(filename)
IO.File.WriteAllBytes(filename, bytes)

(ditemi se manca qualcosa)

metodo di theprogrammer:

:-? (ho capito solo che specifica una quantita di bytes e utilizza dei separatori alfanumerici per dichiarare inizio e fine dell'array di bytes)

Ultima modifica effettuata da dedalux il 18/07/2009 alle 12:35
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 12:44
Sabato, 18/07/2009
Testo quotato

Postato originariamente da dedalux:

Ok ma non ho capito ...



La questione non e' sui dettagli (il "protocollo applicativo" te lo puoi inventare tu ...).

Il discorso importante e' che le due parti in comunicazione devono sapere, in ogni momento, cosa si deve trasmettere e cosa si deve ricevere (e non importa chi e' il server o il client perche', in questo caso, non e' una caratteristica "fisica" del computer ma soltanto una "funzione" della comunicazione che, alternativamente, possono avere tutti e due i sistemi).

Chi inizia a trasmettere deve indicare all'altro sistema, cosa ha intenzione di trasmettere e quanto e' lungo il dato trasmesso ... quindi, ad esempio (ribadisco, ad esempio, ma potresti inventarti tu un altro protocollo ...), chi vuole trasmettere un messaggio di testo, lo fa inviando la stringa

|msg|...messaggio trasmesso...|

e chi riceve rileva i caratteri separatori | per comprendere il messaggio in arrivo.
Se chi vuole trasmettere, vuole inviare un file, invia i dati

|file|1234567|...dati binari file...

in cui non esiste terminatore alla fine perche' hai inviato la lunghezza del file che stai trasmettendo.

Questo e' tutto quello che ti serve. A te convertire il tutto in codice ... se hai ancora dubbi, chiediti anche se, allo stato attuale delle tue conoscenze, questo progetto non sia un po' troppo difficile per te ...



Ultima modifica effettuata da theprogrammer il 18/07/2009 alle 12:45
PM Quote
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 14:22
Sabato, 18/07/2009
Il fatto che sia una funzione lo so, mi esprimo in questi termini perche il mio interesse è quello di inviare la stringa/file da server a client.

In ogni caso

il client dovrebbe fare in un timer che controlla l'arrivo di dati qualcosa di simile a questo
Codice sorgente - presumibilmente VB.NET

  1. If Client1.Connected Then
  2.             If Client1.Available > 0 And netstream.CanRead Then
  3.                 Dim Bytes(Client1.ReceiveBufferSize) As Byte
  4.                 netstream.Read(Bytes, 0, Client1.ReceiveBufferSize)
  5.  
  6.                 Dim msg As String = System.Text.UTF8Encoding.UTF8.GetString(Bytes)
  7.                 'If msg = "Disconnesso" Then
  8.                 '    Application.Exit()
  9.                 'End If
  10.                 txtDialogo.AppendText(vbCrLf & "<" & Now.ToShortDateString & ">" & "<" & Now.ToLongTimeString & "> " & msg)
  11.             End If
  12.         End If



per la stringa, il punto e che se io inserisco il codice commentato, quello non funziona..

inoltre, come ho gia detto, non so quale sia il comando per analizzare una stringa di quel tipo..
l'unica idea che mi viene in mente è fare uno split con "|" e creare un'insieme di stringhe, se la prima è "file" allora quella seguente la passo come parametro di quantita di byte e la seconda come i bytes da scrivere.
pero ripeto non so come passare questi parametri....

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 14:33
Sabato, 18/07/2009

Intanto ti dico che usare un timer per controllare se sono arrivati dei dati dalla rete, non mi pare una buona idea. Se arrivano dei dati, devi utilizzare gli eventi appositi delle classi che utilizzi per riceverli. Ci sono apposta.

E poi, devi tenere presente che la ricezione dei dati dalla rete non segue le regole di una qualsiasi ricezione dati come potrebbe essere quella dalla seriale.
Cio' che trasmetti in un momento, non e' detto che sia ricevuto "completamente" in una sola volta ma e' possibile che venga ricevuto per parti (tutto, nell'ordine corretto ma per parti).

Ad esempio, per capire, la parola "Disconnesso" e' possibile che arrivi in due momenti, prima

Disco

e poi

nnesso

oppure che arrivino dei dati prima e dopo

xxxxDisconnessoyyy

o una qualsiasi combinazione di questi eventi (devi tenere conto delle regole del protocollo TCP ...).

Per scrivere una applicazione "robusta" e funzionante in tutti i casi, devi prevedere una analisi delle stringhe che ricevi impostando una sorta di "macchina a stati finiti".

Ecco perche' la realizzazione di programmi client/server (che siano trojan o no), non e' semplice per chi inizia e prevede, invece, una ottima conoscenza informatica in tutte le sue sfumature ...

PM Quote
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 14:45
Sabato, 18/07/2009
Per il timer l'ho usato in quanto ho visto che nella maggior part degli esempi si usava quello =)
ma se ci son odegli esempi sono d'accordo anch'io sia meglio utilizzare quelli, mi documentero..

Che la trasmissione dei dati avvenisse a blocchi lo sapevo, ed neho avuto conferma trasmettendo una stringa molto lunga, accorgendomi che vengono inviati (in condizioni normali) circa 8200 caratteri.

Quanto a prevedere ogni situazione che puo verificarsi penso sia una cosa che si impara, oltre che con il ragionamento, con l'esperienza, e concordo su quanto hai detto.

Ma riguardo a cio che deve fare il server per inviare il file, e non penso(spero) sia la cosa piu complessa: come si fa? :d

Ultima modifica effettuata da dedalux il 18/07/2009 alle 14:48
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 15:04
Sabato, 18/07/2009
Testo quotato

Postato originariamente da dedalux:

Ma riguardo a cio che deve fare il server per inviare il file, e non penso(spero) sia la cosa piu complessa: come si fa? :d



Mi pare di averti gia' risposto ... andiamo ... si invia il pacchetto di dati che ti ho mostrato, secondo i casi ... (msg o file) ... sempre, come esempio ...


PM Quote
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 16:16
Sabato, 18/07/2009
Si ma qual'è il comando... il codice...

io ho pensato a qualcosa tipo questo...
sbaglio?

Codice sorgente - presumibilmente VB.NET

  1. Dim OpenFileDialog1 As New OpenFileDialog
  2.  
  3.         With OpenFileDialog1
  4.             .DefaultExt = "txt"
  5.             .FileName = "(Server)"
  6.             .Filter = "File jpeg|*.jpeg|Tutti i files|*.*"
  7.             .FilterIndex = 1
  8.             .Title = "(Server)"
  9.         End With
  10.  
  11.         If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
  12.             Try
  13.                 If Client1.Connected And NetStr.CanWrite Then
  14.                     Dim file = String.Format("File|", OpenFileDialog1.FileName, _
  15.                 FileLen(OpenFileDialog1.FileName))
  16.                     Dim Bytes() As Byte = System.Text.UTF8Encoding.UTF8.GetBytes(file)
  17.                     NetStr.Write(Bytes, 0, Bytes.Length)
  18.                 End If
  19.             Catch fileException As Exception
  20.                 Throw fileException
  21.             End Try
  22.         End If
  23.  
  24.         OpenFileDialog1.Dispose()
  25.         OpenFileDialog1 = Nothing



è questo che non riesco a capire come fare...

Ultima modifica effettuata da dedalux il 18/07/2009 alle 16:17
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 16:24
Sabato, 18/07/2009
Cosa e' NetStr ?

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo