Tasferimento files

sabato 01 luglio 2006 - 15.13

Isteriko Profilo | Newbie

Ciao raga , ho appena finito di creare due applicazioni una client e una server per comunicare e passare dati da due pc in remoto.
Ora per trasferire del testo sono riuscito ad usare le socket con successo.. ma ho un piccolo problema con lo stesso metodo non riesco assolutamente a far trasferire file di qualunque tipo o specie... esempio voglio recuperare una foto dal server e portarla al client...

Come posso fare ?? quali sono i metodi da utilizzare per trasferire file ??

Premetto che utilizzo visualstudio 2003 .

Vi prego illuminatemi.......

Brainkiller Profilo | Guru

>Come posso fare ?? quali sono i metodi da utilizzare per trasferire
>file ??

Il meccanismo è identico, perchè dici di non riuscire a trasferire file "binari" ? Che metodo hai utilizzato per il trasferimento ? Che inconvenienti incontri ? Perchè sostieni che non funziona ?
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

blood Profilo | Senior Member

>Ciao raga , ho appena finito di creare due applicazioni una client
>e una server per comunicare e passare dati da due pc in remoto.
>Ora per trasferire del testo sono riuscito ad usare le socket
>con successo.. ma ho un piccolo problema con lo stesso metodo
>non riesco assolutamente a far trasferire file di qualunque tipo
>o specie... esempio voglio recuperare una foto dal server e portarla
>al client...
>
>Come posso fare ?? quali sono i metodi da utilizzare per trasferire
>file ??
>
>Premetto che utilizzo visualstudio 2003 .
>
>Vi prego illuminatemi.......

scusa ma non effettui la conversione in binario per trasferire anche il testo??
Il procedimento è lo stesso, si converte in un buffer di bytes e si invia al client dove effettuerà l'operazione inversa...magari dicci che problemi ti dà così vediamo di risolverli
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

Posto il codice sia di invio che di ricezione dati... funziona tutto ma se passo un dato di tipo binario non funziona suppongo che debba fare qualke conversione o non so che altro ....

INVIO DATI

Dim IP As String = ipclient
Dim PORT As Integer = 5555
Dim DATA As String = "ok"

Try
SendMessage(IP, PORT, DATA)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error sending message")
End Try



Public Sub SendMessage(ByVal Ip As String, ByVal Port As Integer, ByVal Message As String)
If Not checkip(Ip) Then
Throw New Exception("Ip is not in the right format")
Exit Sub
End If
Try
Dim client As New System.Net.Sockets.TcpClient
Dim Buffer() As Byte = System.Text.Encoding.Default.GetBytes(Message.ToCharArray)
client.Connect(Ip, Port)
client.GetStream.Write(Buffer, 0, Buffer.Length)
client.Close()
Catch ex As Exception
Throw New Exception("Remote IP is not reachable")
End Try



RECUPERO DATI

Private Sub OnConnect()
Dim Client As System.Net.Sockets.Socket = Listener.AcceptSocket
Dim Buffer() As Byte
Try
Dim bi As Integer = 0
While Client.Available > 0
ReDim Preserve Buffer(bi)
Client.Receive(Buffer, bi, 1, Sockets.SocketFlags.None)
bi += 1
End While
Catch e As IndexOutOfRangeException

End Try
Dim message As String = System.Text.Encoding.Default.GetString(Buffer)
Dim REP As System.Net.IPEndPoint = Client.RemoteEndPoint
Client.Close()
Dim args As New InMessEvArgs(message, REP.Address.ToString())
RaiseEvent IncomingMessage(args)
End Sub

Public Structure InMessEvArgs
Dim message As String
Dim senderIP As String
Public Sub New(ByVal Message As String, ByVal SenderIP As String)
Me.message = Message
Me.senderIP = SenderIP
End Sub
End Structure


Private Sub OnIncomingMessage(ByVal Args As ServerClass.InMessEvArgs) Handles Srv.IncomingMessage
' recupero il comando inviato al server
comando = Args.message
ipclient = Args.senderIP

.
.
.
.
END SUB


Ciauz

blood Profilo | Senior Member

devi crearti un OpenFileDialog per selezionare il file, dopodichè usi la funzione StreamFromFile (converti in byte) e dopodiche trasferisci..oppure:

Dim stream as String
Dim leggi_file As New System.IO.StreamReader(OpenFileDialog.FileName)
stream = file.ReadToEnd() ' leggi i byte del file

dopodiche userai uno StreamWriter per scriverlo sul file dall'altra parte dopo aver trasmesso i byte via socket ( penso che sai come fare )

ps. ma in questo code che hai incollato il file come ce lo mettevi che usi la funzione SendMessage solo con stringhe di dati???
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

si praticamente riesco a trasmettere solo stringhe , cmq il codice l'ho riadattato da uno script trovato in rete...
Ora cerco di capire cio' che hai scritto praticamente faccio lo streamreader del file anche se è un file di tipo immagine?? dopo di che assegno tutto alla variabile stream e passo tale variabile come parametro nel sendmessage?
Dopo di che riscrivo il file con lo streamwriter dall'applicazione client...

Ho capito bene o ho saltato qualke procedimento?

Grazie

Isteriko Profilo | Newbie

Dim file As String = "c:\windows\win32_system\captured.gif"
Dim stream As String
Dim FileReader As New System.IO.StreamReader(file)
stream = FileReader.ReadToEnd() ' leggi i byte del file
inviatestoimmagine(stream, ipclient)

Public Sub inviatestoimmagine(ByVal testo As String, ByVal ipclient As String)
Dim IP As String = ipclient
Dim PORT As Integer = 5555
Dim DATA As String = "immagine" & "*" & testo
Try
SendMessage(IP, PORT, DATA)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error sending message")
End Try
End Sub

Public Sub SendMessage(ByVal Ip As String, ByVal Port As Integer, ByVal Message As String)
Try
Dim client As New System.Net.Sockets.TcpClient
Dim Buffer() As Byte = System.Text.Encoding.Default.GetBytes(Message.ToCharArray)
client.Connect(Ip, Port)
client.GetStream.Write(Buffer, 0, Buffer.Length)
client.Close()
Catch ex As Exception
Throw New Exception("Remote IP is not reachable")
End Try
End Sub


questo è lo script modificato in base a quanto ho capito ... ma non funziona lo stesso.. mi passa una stringa al client... :(

blood Profilo | Senior Member

ma ci credo, non devi passargli il file mediante stringa ma devi usare l'openfiledialog come ti ho detto io e poi devi crearti un array di bytes() a cui devi assegnare il file.readtoend() che sarà poi il parametro con cui usare il send ... per il resto il metodo è quello hai capito bene.
Cerca qualche info sull'uso del openfiledialog e la cattura dei file, sicuramente ne verrai a capo da solo!
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

il problema è che l'applicazione non è in locale ma in remoto quindi non posso usare l'openfiledialog ...

Isteriko Profilo | Newbie

esiste un altro modo per passargli l'immagine?

Dim stream() As Byte
Dim FileReader As New System.IO.StreamReader(file)
stream = FileReader.ReadToEnd ' leggi i byte del file

mi restituisce un errore nella terza riga dicendo che è impossibile convertire un valore di tipo stringa in una matrice di byte...

ma non è che avresti un esempio già fatto magari vedo meglio?

grazie!

p.s.
anche utlizzando il metodo cosi per prova come hai detto tu mi restituisce lo stesso errore...

Dim stream() As Byte
Dim FileReader As New System.IO.StreamReader(OpenFileDialog1.FileName)
stream = FileReader.ReadToEnd ' leggi i byte del file

blood Profilo | Senior Member

>Dim stream as String
>Dim leggi_file As New System.IO.StreamReader(OpenFileDialog.FileName)
>stream = file.ReadToEnd() ' leggi i byte del file

io cosi avevo detto...cmq sia al tuo ultimo code cambiaci da bytes a stringa la variabile a cui associ il readtoend

ps. se è ini remoto allora passagli direttamente l'intera path del file,quindi fai cosi:

Dim stream as String
Dim file as New System.IO.StreamReader("C:\ciccio\ciccio.jpg")
stream = file.ReadToEnd()

dopodichè dall'altra parte fai lo StreamWriter ed il file è pronto

---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

senti tutto ok come hai detto avevo provato anche ieri a cambiare da vettorebyte come mi avevi detto in string riesco a passare i dati ma quando vado a fare lo streamwriter mi da il seguente errore...

Illegal characters in path.

se vado a visualizzare i dati passati in una texbox sono i seguenti quindi credo che la cosa funzioni...

zVPcx0Tm8h?Mv}:D(t') O=O?z>1K c?g?3 k/?4 T!

quindi qualkosa trasferisce...

ciao

blood Profilo | Senior Member

dice che la path in cui vuoi scrivere o dove è presente il file è errata...cosa c'entra la path scusa?

ps. ri pastami il codice che usi dalla parte in cui ricevi e poi scrivi con lo streamwriter
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

allora

Public Sub dataReceived(ByVal data As System.String) Handles mySocketClientWrapper.dataReceived
'evento generato dal client in seguito alla ricezione di dati
listBoxRcv.Items.Add(New String(data + Chr(13) + Chr(10)))


End Sub

questa praticamente va a scrivere in una listbox i dati ricevuti in caso fosse del testo....


ora questa la dovrei trasformare come??

Public Sub dataReceived(ByVal data As System.String) Handles mySocketClientWrapper.dataReceived

Dim scrivi_filestream As New StreamWriter(data) 'questa è la stringa che restituisce errore....

End Sub

e cmq dopo che il codice che restituisce errore che altro dovrei fare per trasformare nuovamento lo streaming in un file jpg come in questo caso??


blood Profilo | Senior Member

>
>Public Sub dataReceived(ByVal data As System.String) Handles
>mySocketClientWrapper.dataReceived
>
>Dim scrivi_filestream As New StreamWriter(data) 'questa è la
>stringa che restituisce errore....
>
>End Sub
>

ma no lì devi specificarci la path dove salvare il file ad es. "C:\ciccio.jpg"
dopodiche fai

scrivi_filestream.Write(data)
scrivi_filestream.Close()

ecco cosa c'entrava la path
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

Isteriko Profilo | Newbie

:))) ok provo immediatamente... thnx

fatto l'immagine la salva ma a quanto pare non la visualizza ... credo abbia bisogno di qualke tipo di conversione... sai gia come fare vero?? Grazie anticipatamente...

Try
Dim scrivi_filestream As New StreamWriter("c:\immagine.gif")
scrivi_filestream.Write(data)
scrivi_filestream.Close()
Catch ex As Exception

End Try

Isteriko Profilo | Newbie

Ho trovato anche uno script per la conversione della stringa in un array di byte e successivamente scriverlo in un memorystream per poi assegnare l'immagine alla picturebox... ma non funziona... :(

Dim arraystring() As Byte = System.Text.Encoding.UTF8.GetBytes(data)
Dim count As Integer = arraystring.Length
Dim ms As New MemoryStream
ms.Write(arraystring, 0, count)
PictureBox1.Image = Image.FromStream(ms)
ms.Close()

quando vado ad assegnare alla picturebox l'image.fromstream(ms) mi dice invalid parameter used....

Ora ho lo stream è corrotto o non so che caxx devo fare ma dico io non esiste nessun esempio già bello e fatto di sta cosa?? UFF
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5