Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    [ vb-net ]trasferimento file client server

    Ho cercato su google delle informazioni per cercare di cotruire un programmino che trasferisce un file da client a server o viceversa.
    Ho trovato questa guida: http://totem.altervista.org/guida/versione2/C16.php

    Sembra molto chiara ma ho provato a far girare i due programmi client e server e durante il trasferimento di un file immagine il client smette di inviare il file al server

    Voi cosa ne pensate della guida?
    jabjoint

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La guida è ottima ...

    Non so se ci siano problemi sul codice ma, se ci sono, comincia ad identificarli bene, mostra il codice, gli errori e chiedi qui.

    Non "genericamente", perché nessuno proverà da zero tutto il codice per capire al posto tuo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    grazie per la risposta, ma il codice non da nessun errore e non è facile per me identificare il perchè si blocca il trasferimento altrimenti non avrei avuto bisogno della guida.
    Io ho notato che qui c' è l' uso di vari timer secondo voi sono indispensabili?
    cmq mi sbatto un pò poi vi faccio sapere...
    jabjoint

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da jabjoint
    grazie per la risposta, ma il codice non da nessun errore e non è facile per me identificare il perchè si blocca il trasferimento altrimenti non avrei avuto bisogno della guida.
    Ma la guida adesso ce l'hai ...

    mi sbatto un pò poi vi faccio sapere...
    Ecco ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Allora mi sono accorto che si blocca esattamente a 4096 byte se il file è più piccolo lo spedisce e ci aggiunge lui dei byte vuoi fino a 4096 se è più grande si interrompe a 4096
    L' errore deve essere tra le seguenti righe di codice:

    codice:
     
    Private Sub bgSendFile_DoWork(ByVal sender As Object, _
            ByVal e As DoWorkEventArgs) Handles bgSendFile.DoWork
            'Ottiene il nome del file dall'argomento passato al metodo
            'RunWorkerAsync nella procedura precedente
            Dim FileName As String = e.Argument
            'Crea un nuovo lettore del file a basso livello, così
            'da poter ottenere bytes di informazione anziché caratteri
            'come nello StreamReader
            Dim Reader As New IO.FileStream(FileName, IO.FileMode.Open)
            'Calcola la grandezza del file, per poter poi tenere
            'l'utente al corrente della percentuale di completamento
            Dim Size As Int64 = FileLen(FileName)
            'Un blocco di bytes da 4096 posti. Il file viene spedito in
            '"pacchettini" per evitare di sovraccaricare la connessione
            Dim Bytes(4095) As Byte
    
            'Se il file è più grande di 4KiB, lo divide
            'in blocchi di dati da 4096 bytes
            If Size > 4096 Then
                For Block As Int64 = 0 To Size Step 4096
                    'Se i bytes rimanenti sono più di 4096,
                    'ne legge un blocco intero
                    If Size - Block >= 4096 Then
                        Reader.Read(Bytes, 0, 4096)
                    Else
                        'Altrimenti un blocco più piccolo
                        Reader.Read(Bytes, 0, Size - Block)
                    End If
                    'Scrive i dati prelevati sullo stream di rete,
                    'inviandoli così al server
                    NetFile.Write(Bytes, 0, 4096)
                    'Riporta la percentuale all'utente
                    bgSendFile.ReportProgress(Block * 100 / Size)
                    'Smette per 30ms, così da dare tempo dal
                    'server di poter processare i pacchetti uno per
                    'uno, evitando confusione
                    Threading.Thread.Sleep(30)
                Next
            Else
                'Se il file è minore di 4KiB, lo invia tutto
                'direttamente dal server
                Reader.Read(Bytes, 0, Size)
                NetFile.Write(Bytes, 0, Size)
            End If
            Reader.Close()
    
            'Percentuale massima: lavoro terminato
            bgSendFile.ReportProgress(100)
            Threading.Thread.Sleep(100)
            'Comunica la fine delle operazioni
            NetFile.Write(ASCII.GetBytes("END"), 0, 3)
            MessageBox.Show("File inviato con successo!", Me.Text, _
                MessageBoxButtons.OK, MessageBoxIcon.Information)
            Me.cmdSend.Enabled = True
        End Sub
    jabjoint

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per fare prima, potresti inviare un PM a chi ha scritto il codice, che è anche utente di questo forum ... scrivi a

    Il Totem
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    grazie ho seguito il tuo consiglio!
    jabjoint

  8. #8
    Ciao, qual'era il problema? sto seguendo anche io quella guida

  9. #9
    Allora mi sono accorto che avevo dimenticato di mettere un TRUE nella proprietà del WorkerReportsProgress nel BackgrounWorker del server che tralatro è un controllo che non ho mai usato è devo ancora capirne il funzionamento.
    Comunque nonostante ciò facendo partire il programma non si blocca come prima.
    Prima infatti il server non proseguiva il progresso mentre ora il server in alcuni casi arriva a conclusione avvisando con il messaggio "file spedito correttamente" ma la barra di progresso del client non conclude l' avanzamento; perciò il file ricevuto non si apre.

    il client si blocca alla riga:

    NetFile.Write(Bytes, 0, 4096)

    In alcuni casi il server solleva la seguente eccezione:

    Eccezione generata dalla destinazione di una chiamata.

    e si ferma a questa riga:

    bgReceiveFile.RunWorkerAsync() della sub tmrControlFile_Tick
    jabjoint

  10. #10
    ciao, grazie per la risposta, la mia situazione è questa, sto passando da un pc(server e uno client) un file xml da 180K, il codice che sto usando ( prendendo spunto dalla guida) è questo:
    Sender file:
    codice:
    Private Sub FileThread()
            Dim PercorsoPrivato As String = PercorsoFileTX
            Dim IpPrivatoDestrinatario As String = IpDestinatarioFile
            Thread.Sleep(Rnd() * 10)
            Dim pingResult As Boolean = False
            Try
                pingResult = My.Computer.Network.Ping(IpPrivatoDestrinatario)
            Catch
                pingResult = False
            End Try
            Dim Reader As New IO.FileStream("c:\Sched_Termo.sch", FileMode.Open)
            Dim Sizez As Int64 = FileLen("c:\Sched_Termo.sch")
            If pingResult = True Then
                Try
                    Dim Client As New TcpClient(IpPrivatoDestrinatario, 8003)
                    'Dim Writer As New StreamWriter(Client.GetStream())
                    Dim NetFile As NetworkStream
                    NetFile = Client.GetStream
                    If Client.Connected = True Then
                        Dim ByteFile(4096) As Byte
                        If Sizez > 4096 Then
                            For Block As Int64 = 0 To Sizez Step 4096
                                If Sizez - Block >= 4096 Then
                                    Reader.Read(ByteFile, 0, 4096)
                                Else
                                    Reader.Read(ByteFile, 0, Sizez - Block)
                                End If
                                NetFile.Write(ByteFile, 0, 4096)
                                Thread.Sleep(10)
                            Next
                        End If
                    End If
                    'Reader.Close()
                    NetFile.Write(ASCIIEncoding.ASCII.GetBytes("END"), 0, 3)
                    Client.Close()
                    pingResult = pingResult
                Catch ex As Exception
    
                End Try
            End If
            Reader.Close()
        End Sub
    il ricevente è questo :
    codice:
    Public Sub LeggidatiFile()                       'SOCKET 8003
            Dim netstream As NetworkStream = SocketFile.GetStream
    
            Dim Stream As New IO.FileStream("c:\p1.sch", IO.FileMode.Create)
            Dim Indice As Int64 = 0
            If SocketFile.Connected Then
                Do While SocketFile.Available
                    Dim bytes(4096) As Byte
                    Dim Msg As String = ASCII.GetString(bytes)
                    If Msg.Contains("END") Then
                        Exit Do
                    End If
                    netstream.Read(bytes, 0, 4096)
                    Stream.Write(bytes, 0, 4096)
                    Indice += 4096
                    Thread.Sleep(9)
                Loop
                SocketFile.Close()
            End If
            Stream.Close()
            Messaggio = Messaggio
        End Sub
    con il mio codice ricevo il file ma è inspiegapilmente piu grosso dell'originale e il "END" viene scritto su file e non viso dalla funzione : Dim Msg As String = ASCII.GetString(bytes).
    mettendo lo sleep sulla funzione ricevente ricevo 180K, senza si blocca a 4k. il motivo, secondo me, è che il socket diventa non disponibile dopo il primo blocco.
    se hai qualche idea su come migliorare il mio codice dimmi pure, sto sclerando da questa mattina spero di esserti d'aiuto anche per il tuo problema

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.