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 - Winsock e Trasferimento Immagini (VB2010)
Forum - C# / VB.NET - Winsock e Trasferimento Immagini (VB2010)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
VBasicPC (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/08/2010

Segnala al moderatore
Postato alle 23:20
Martedì, 17/08/2010
Prima di tutto vi saluto.

Ecco il mio problema:

Ho incluso nel mio Visual Basic 2010 il vecchio controllo Winsock del VB6.

Sono al corrente che è vecchio come controllo, e che sarebbe meglio passare ai sockets del VB.NET; ma faccio parte di un piccolo gruppo di programmatori (quindicenni) che vogliono mettere su una semplice chat (per divertirci un pò xD), e mi hanno chiesto di fare la parte del trasferimento file e immagini.

Purtroppo io però non sono molto bravo con il VB.NET (Di solito programmo in Java, ma ero l' unico a conoscerlo), ho scritto un piccolo codice che legge l' immagine su disco in modalità binaria e che la invia sottoforma di byte, e fin qui ci siamo. Il problema è che l' immagine, quando viene ricreata dall' altra parte, è illeggibile (Nonostante chiudo il file dopo averlo creato).

Dunque dovrei riuscire a creare un codice che legge e invia i byte pian piano, ovvero non tutti assieme.

Vi posto i miei due blocchi di codice (Client che invia e Server che riceve):

Client:

Codice sorgente - presumibilmente VB.NET

  1. Dim Image As Byte
  2.             FileOpen(1, "C:\Foto.jpg", OpenMode.Binary)
  3.             While Not EOF(1)
  4.                 FileGet(1, Image)
  5.                 Winsock2.SendData(Image)
  6.             End While
  7.             FileClose(1)



Server:

Codice sorgente - presumibilmente VB.NET

  1. FileOpen(1, "C:\Img.jpg", OpenMode.Binary)
  2.  
  3.     Private Sub Winsock1_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival
  4.         Dim File As Byte
  5.         Winsock1.GetData(File)
  6.         FilePut(1, File)
  7.     End Sub



Naturalmente in questi due pezzi di codice i file sono già scelti da me, ma perchè fanno parte solo di un programma test per poi applicare questo codice nella chat.

Inoltre ne approfitto: Con questo codice, ho provato a trasferire un file TXT che all' interno contiene "Ciao Mondo"; solo che il file non veniva mai creato completamente, a volte vi era scritto "Ciao M", a volte solo "Ci" etc.

Mi rivolgo a voi dato che siete esperti in questo campo.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:13
Mercoledì, 18/08/2010

a parte qualsiasi considerazione sull' !OLD! grande come una casa che stai facendo,
ti darò comunque la soluzione al tuo problema :)

a causa di un algoritmo di rete chiamato nagle algorithm che gioca un ruolo fondamentale nella frammentazione dei pacchetti TCP, una SendData _NON_ corrisponde necessariamente ad _UN_ evento DataArrival :)

quindi per risolvere il tuo problema basta che nell'evento DataArrival aggiungi i byte ricevuti ad un buffer, e, mettiamo caso che la "fine trasmissione immagine" sia la chiusura della connessione, nell'evento close scrivi il contenuto del buffer nel file immagine.

spero di essermi spiegato.

N.B: si sceglie per semplicità l'evento di chiusura della connessione per delimitare la fine dell'immagine, questo implica che, data la connessione principale su cui viaggiano i messaggi della chat, verrà aperta una connessione parallela per inviare ogni immagine.

nulla vieta di inviare l'immagine nello stream principale di dati, peccato che poi bisogna gestirsi la detection della fine immagine e non è semplice.

PM Quote
Avatar
VBasicPC (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/08/2010

Segnala al moderatore
Postato alle 0:22
Mercoledì, 18/08/2010
Grazie per aver risposto :); ma come ho detto non sono molto bravo con il vb.net, ed un piccolo esempio pratico non mi guasterebbe; non che voglia fare un copia e incolla ma non ho capito precisamente cosa intendi... 8-|

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:32
Mercoledì, 18/08/2010
Testo quotato

Postato originariamente da VBasicPC:

Grazie per aver risposto :); ma come ho detto non sono molto bravo con il vb.net, ed un piccolo esempio pratico non mi guasterebbe; non che voglia fare un copia e incolla ma non ho capito precisamente cosa intendi... 8-|



preciso ma non fornisco codice :)

può darsi che il pacchetto che invii con senddata contenente l'immagine venga diviso in più pacchettini, questo comporta lo scatenamento di più di un evento dataarrival, ognuno con un pezzo dell'immagine (in ordine ovviamente). la soluzione sta proprio qui, bisogna predisporre un buffer in cui accumulare ad ogni evento dataarrival i dati ricevuti, una volta chiusa la connessione scrivere i dati contenuti nel buffer nel file dell'immagine.

se così non riesci, patate :)

PM Quote
Avatar
VBasicPC (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/08/2010

Segnala al moderatore
Postato alle 0:41
Mercoledì, 18/08/2010
Il mio problema è proprio quello... non so creare un buffer in cui accumulare ad ogni evento dataarrival i dati ricevuti...

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 1:17
Mercoledì, 18/08/2010

il mio consiglio è aprire uno streamreader verso il file e ad ogni dataarrivar scriverci dentro i dati come vengono, all'evento close chiudere il file.


PM Quote
Avatar
VBasicPC (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/08/2010

Segnala al moderatore
Postato alle 1:24
Mercoledì, 18/08/2010
Allora; ecco come ho provato a risolvere, ma tutto ciò che si crea nel file immagine è " ", cioè uno spazio. :_doubt:.

Client che invia:

Codice sorgente - presumibilmente VB.NET

  1. Dim Img As Byte
  2.             FileOpen(1, "C:\Img1.png", OpenMode.Binary)
  3.             While Not EOF(1)
  4.                 FileGet(1, Img)
  5.                 Winsock2.SendData(Img)
  6.             End While
  7.             FileClose(1)
  8.             Winsock2.Close()



Server che riceve:

Codice sorgente - presumibilmente VB.NET

  1. Dim Img2 As Byte
  2.  
  3. ...
  4.  
  5.     Private Sub Button13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click
  6.         Try
  7.             Winsock1.SendData("253.ReceiveImage")
  8.             FileOpen(1, "C:\Img245.png", OpenMode.Binary)
  9.         Catch ex As Exception
  10.  
  11.         End Try
  12.     End Sub
  13.  
  14. ...
  15.  
  16.     Private Sub Winsock1_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival
  17.         Dim Img As Byte
  18.         Winsock1.GetData(Img)
  19.         Img2 &= Img
  20.     End Sub
  21.  
  22. ...
  23.  
  24.     Private Sub Winsock1_CloseEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles Winsock1.CloseEvent
  25.         Winsock1.Close()
  26.         FilePut(1, Img2)
  27.         FileClose(1)
  28.     End Sub



Sono disperato... Sono 4 giorni che cerco di trasferire una stupida immagine... xD

Ultima modifica effettuata da VBasicPC il 18/08/2010 alle 1:55
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 2:06
Mercoledì, 18/08/2010
Testo quotato

Postato originariamente da VBasicPC:
Sono disperato... Sono 4 giorni che cerco di trasferire una stupida immagine... xD



per il tuo bene non ti dico nulla sul codice, però invece ti dico altro: prima di programmare in vb.net devi studiare a fondo il framework, non ci si può improvvisare come si faceva in vb6 (mica vero poi).

il vb.net è solo uno specchietto per le allodole, cioè i programmatori vb6 che vogliono passare alla nuova versione, peccato poi sfugga che vb.net è un linguaggio full oop basato totalmente su un framework che VA SAPUTO.

detto questo posso solo augurarti buono studio, è per il tuo bene.

PM Quote
Avatar
VBasicPC (Normal User)
Newbie


Messaggi: 8
Iscritto: 17/08/2010

Segnala al moderatore
Postato alle 3:04
Mercoledì, 18/08/2010
Lavorando un pò con la logica sono riuscito a ricevere file e immagini. Ma il problema è che l' immagine arriva al 70%, cioè si vede il 70% dell' immagine ed il resto è nero xD.

Comunque il VB.NET lo sto utilizzando solo in questo programma, cioè come ho detto di solito programmo in Java, ho solo voluto fare parte ad un progetto di alcuni miei amici.

Ultima modifica effettuata da VBasicPC il 18/08/2010 alle 3:08
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo