Oppure

Loading
18/07/09 8:30
riseofapocalypse
La sintassi la decidi tu! :rotfl: ci sono due vie: quella che ho detto io e quella che ha detto programmer, sono entrambe efficienti, la scelta devi farla tu! :k:
aaa
18/07/09 10:34
dedalux
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 18/07/09 10:35
aaa
18/07/09 10:44
theprogrammer
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 18/07/09 10:45
aaa
18/07/09 12:22
dedalux
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
If Client1.Connected Then
            If Client1.Available > 0 And netstream.CanRead Then
                Dim Bytes(Client1.ReceiveBufferSize) As Byte
                netstream.Read(Bytes, 0, Client1.ReceiveBufferSize)

                Dim msg As String = System.Text.UTF8Encoding.UTF8.GetString(Bytes)
                'If msg = "Disconnesso" Then
                '    Application.Exit()
                'End If
                txtDialogo.AppendText(vbCrLf & "<" & Now.ToShortDateString & ">" & "<" & Now.ToLongTimeString & "> " & msg)
            End If
        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....
aaa
18/07/09 12:33
theprogrammer

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 ...
aaa
18/07/09 12:45
dedalux
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 18/07/09 12:48
aaa
18/07/09 13:04
theprogrammer
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 ...

aaa
18/07/09 14:16
dedalux
Si ma qual'è il comando... il codice...

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

Dim OpenFileDialog1 As New OpenFileDialog

        With OpenFileDialog1
            .DefaultExt = "txt"
            .FileName = "(Server)"
            .Filter = "File jpeg|*.jpeg|Tutti i files|*.*"
            .FilterIndex = 1
            .Title = "(Server)"
        End With

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                If Client1.Connected And NetStr.CanWrite Then
                    Dim file = String.Format("File|", OpenFileDialog1.FileName, _
                FileLen(OpenFileDialog1.FileName))
                    Dim Bytes() As Byte = System.Text.UTF8Encoding.UTF8.GetBytes(file)
                    NetStr.Write(Bytes, 0, Bytes.Length)
                End If
            Catch fileException As Exception
                Throw fileException
            End Try
        End If

        OpenFileDialog1.Dispose()
        OpenFileDialog1 = Nothing


è questo che non riesco a capire come fare...
Ultima modifica effettuata da dedalux 18/07/09 14:17
aaa