Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET]Errore invio file Socket
Forum - C# / VB.NET - [VB.NET]Errore invio file Socket

Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 21:43
Domenica, 07/03/2010
Ciao a tutti, studiando dalla guida di Il Totem, mi sono imbattuto in questo problema, stavo provando a inserire nuove funzioni nel codice, quale annullare l'invio di un file, solo che non riesco a far capire al server che ho annullato l'operazione dal client, ho provato ad inviare tramite il client un messaggio al server, ma sembra che non lo riceve.

Il codice del Client:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub bgSendFile_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgSendFile.DoWork
  2.         'Ottiene il nome del file dall'argomento passato al metodo
  3.         'RunWorkerAsync nella procedura precedente
  4.         Dim FileName As String = e.Argument
  5.         'Crea un nuovo lettore del file a basso livello, così
  6.         'da poter ottenere bytes di informazione anziché caratteri
  7.         'come nello StreamReader
  8.         Dim Reader As New IO.FileStream(FileName, IO.FileMode.Open)
  9.         'Calcola la grandezza del file, per poter poi tenere
  10.         'l'utente al corrente della percentuale di completamento
  11.         Dim Size As Int64 = FileLen(FileName)
  12.         'Un blocco di bytes da 4096 posti. Il file viene spedito in
  13.         '"pacchettini" per evitare di sovraccaricare la connessione
  14.         Dim Bytes(4095) As Byte
  15.  
  16.         'Se il file è più grande di 4KiB, lo divide
  17.         'in blocchi di dati da 4096 bytes
  18.         If Size > 4096 Then
  19.             For Block As Int64 = 0 To Size Step 4096
  20.                 'Se i bytes rimanenti sono più di 4096,
  21.                 'ne legge un blocco intero
  22.                 If Size - Block >= 4096 Then
  23.                     Reader.Read(Bytes, 0, 4096)
  24.                 Else
  25.                     'Altrimenti un blocco più piccolo
  26.                     Reader.Read(Bytes, 0, Size - Block)
  27.                 End If
  28.                 'Scrive i dati prelevati sullo stream di rete,
  29.                 'inviandoli così al server
  30.                 NetFile.Write(Bytes, 0, 4096)
  31.                 'Riporta la percentuale all'utente
  32.                 prgProgress.Value = Block * 100 / Size
  33.                 'Smette per 30ms, così da dare tempo dal
  34.                 'server di poter processare i pacchetti uno per
  35.                 'uno, evitando confusione
  36.                 Threading.Thread.Sleep(30)
  37.  
  38.                 If bgSendFile.CancellationPending Then 'If user abort download
  39.                     NetFile.Write(ASCII.GetBytes("STOP"), 0, 4)
  40.                     Exit For
  41.                 End If
  42.  
  43.             Next
  44.         ElseIf Size < 4096 Then
  45.             'Se il file è minore di 4KiB, lo invia tutto
  46.             'direttamente dal server
  47.             Reader.Read(Bytes, 0, Size)
  48.             NetFile.Write(Bytes, 0, Size)
  49.         End If
  50.         Reader.Close()
  51.  
  52.         If bgSendFile.CancellationPending Then 'If user abort download            
  53.             MsgBox("Invio Annullato", MsgBoxStyle.Critical)
  54.         Else
  55.             'Percentuale massima: lavoro terminato
  56.             bgSendFile.ReportProgress(100)
  57.             Threading.Thread.Sleep(100)
  58.             'Comunica la fine delle operazioni
  59.             NetFile.Write(ASCII.GetBytes("END"), 0, 3)
  60.             MsgBox("File inviato con successo!", MsgBoxStyle.Information)
  61.             cmdSend.Enabled = True
  62.         End If
  63.     End Sub



Il codice del server:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub bgReceiveFile_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgReceiveFile.DoWork
  2.         'Apre un nuovo stream in base al percorso costruito
  3.         'nella procedura precedente
  4.         Dim Stream As New IO.FileStream(FileName, IO.FileMode.Create)
  5.  
  6.         Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
  7.         Me.Invoke(safedelegate, 0) 'Invoke the TreadsafeDelegate
  8.  
  9.         'Crea un indice che indica il progresso
  10.         Dim Index As Int64 = 0
  11.         Dim speedtimer As New Stopwatch
  12.         Dim currentspeed As Double = -1
  13.         Dim readings As Integer = 0
  14.  
  15.         lblStatus.Text = "In ricezione..."
  16.         Do
  17.             If FileReceiver.Available Then
  18.  
  19.                 speedtimer.Start()
  20.  
  21.                 'Riceve i bytes necessari
  22.                 Dim Bytes(4096) As Byte
  23.                 Dim Msg As String = ASCII.GetString(Bytes)
  24.                 'Se i bytes sono un messaggio stringa e contengono
  25.                 '"END", oppure la dimensione giusta è già stata
  26.                 'raggiunta, allora si ferma
  27.                 If Msg.Contains("END") Or Msg.Contains("STOP") Or Index >= FileSize Then
  28.                     Exit Do
  29.                 End If
  30.                 'Preleva i bytes dallo stream di rete
  31.                 NetFile.Read(Bytes, 0, 4096)
  32.                 'E li scrive sul file fisico
  33.                 Stream.Write(Bytes, 0, 4096)
  34.                 'Incrementa l'indice di 4096
  35.                 Index += 4096
  36.                 'E notifica il progresso
  37.                 bgReceiveFile.ReportProgress(Index * 100 / FileSize)
  38.  
  39.                 lblStatus.Text = prgProgress.Value & " %"
  40.  
  41.                 Me.Invoke(safedelegate, currentspeed)
  42.  
  43.                 readings += 1
  44.                 If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
  45.                     currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
  46.                     speedtimer.Reset()
  47.                     readings = 0
  48.                 End If
  49.  
  50.             End If
  51.  
  52.         Loop
  53.  
  54.         lblStatus.Text = "File ricevuto!"
  55.         Stream.Close()
  56.         MessageBox.Show("File ricevuto con successo!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
  57.         lblStatus.Text = ""
  58.     End Sub



se stoppo il file dal client, la condizione mi dice che esce dal Do, è mi dovrebbe dire automaticamente, File Ricevuto, almeno per ora, ma rimane fermo. Come posso fare?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:31
Lunedì, 08/03/2010
E' possibile che prima di Stop ci sia un byte nullo che tronca la stringa. Evita di mandare messaggi sui socket deputati all'invio/ricezione di dati. Usa piuttosto i tcp client di controllo.

Ultima modifica effettuata da Il Totem il 08/03/2010 alle 18:32


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote