Salve, è da molto che non programmo in vb.net e infatti sono parecchio arrugginito...
Ho realizzato l'applicazione client server ke legge i dati ed ho creato una seconda istanza del client e server per la ricezione dei file... solo ke provando con un file xls di 9kb, il programma sembra inviare tutto ma il server riceve solo 8kb...
quindi c'è qualkosa che non va...
qui il codice del server:
codice:Imports System.Net.Sockets Imports System.Text.Encoding Public Class frmMain Private client As New TcpClient Private fileClient As New TcpClient Private server As New TcpListener(1989) Private fileServer As New TcpListener(1001) Private NetStream, NetFile As NetworkStream 'Percorso su cui salvare il file Private FileName As String 'Dimensione del file Private FileSize As Int64 Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load server.Start() tmrControlConnection.Start() End Sub Private Sub Send(ByVal Msg As String, ByVal Stream As NetworkStream) 'Se si può scrivere If Stream.CanWrite Then 'Converte il messaggio in binario Dim Bytes() As Byte = ASCII.GetBytes(Msg) 'E lo scrive sul network stream Stream.Write(Bytes, 0, Bytes.Length) End If End Sub 'Ottiene un messaggio dallo stream di rete Private Function GetMessage(ByVal Stream As NetworkStream) As String 'Se si può leggere If Stream.CanRead Then Dim Bytes(client.ReceiveBufferSize) As Byte Dim Msg As String 'Legge i bytes arrivati Stream.Read(Bytes, 0, Bytes.Length) 'Li converte in una stringa leggibile Msg = ASCII.GetString(Bytes) 'E restituisce la stringa Return Msg.Normalize Else Return Nothing End If End Function Function replaceEntity(ByVal str As String) Return Replace(str, "à", "a") End Function Private Sub tmrControlConnection_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrControlConnection.Tick 'Se ci sono connessioni in attesa... If server.Pending Then 'Ferma il timer per eseguire le operazioni tmrControlConnection.Stop() lblStatus.Text = "È stata ricevuta una richiesta ..." 'Accetta la connessione client = server.AcceptTcpClient 'Apre lo stream di rete condiviso NetStream = client.GetStream 'Termina l'ascolto server.Stop() 'Inizia la ricezione di messaggi tmrGetData.Start() lblStatus.Text = "STATO: Connesso" End If End Sub Private Sub tmrControlFile_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrControlFile.Tick 'Se c'è una richiesta, l'accetta subito If fileServer.Pending Then tmrControlFile.Stop() fileClient.ReceiveBufferSize = 1024 fileClient = fileServer.AcceptTcpClient NetFile = fileClient.GetStream 'Ferma il listener fileClient.ReceiveBufferSize = 1024 fileServer.Stop() lblStatus.Text = "Flusso di informazioni aperto ..." 'Attiva la ricezione di dati attraverso un background worker bgReceiveFile.RunWorkerAsync() End If End Sub Private Sub tmrGetData_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrGetData.Tick If client.Connected And client.Available Then 'Ferma il timer mentre si eseguono le operazioni tmrGetData.Stop() 'Legge il messaggio Dim Msg As String = GetMessage(NetStream) If Msg.StartsWith("ConfirmTransfer") Then 'Divide il messagio in parti in base al carattere pipe Dim Parts() As String = Msg.Split("|") 'La prima parte è "ConfirmTransfer" 'La seconda è il percorso del file sull'altro computer Dim File As String = Parts(1) 'La terza è la dimensione Dim Size As Int64 = CType(Parts(2), Int64) 'Ottiene solo il nome del file, senza percorso File = IO.Path.GetFileName(File) 'Costruisce il percorso del file su questo computer, 'salvandolo nella cartella del progetto (bin\Debug) FileName = "C:\" & replaceEntity(File) 'Imposta Size come variabile globale FileSize = Size 'Manda OK al client Send("OK", NetStream) 'Intanto si mette in attesa sulla porta 1001 per 'l'invio dei bytes del file fileServer.Start() 'E attiva il timer di controllo tmrControlFile.Start() End If 'Riprende il controllo tmrGetData.Start() End If End Sub Private Sub bgReceiveFile_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgReceiveFile.DoWork 'Apre un nuovo stream in base al percorso costruito 'nella procedura precedente Dim Stream As New IO.FileStream("C:\prova.xlsx", IO.FileMode.Create) 'Crea un indice che indica il progresso Dim Index As Int64 = 0 lblStatus.Text = "In ricezione ..." For Block As Int64 = 0 To FileSize Step 8192 If fileClient.Available Then 'Riceve i bytes necessari Dim Bytes(8192) As Byte Dim Msg As String = GetMessage(NetFile) 'Se i bytes sono un messaggio stringa e contengono '"END", oppure la dimensione giusta è già stata 'raggiunta, allora si ferma If Msg.Contains("END") Then Exit For End If 'Preleva i bytes dallo stream di rete NetFile.Read(Bytes, 0, 8192) 'E li scrive sul file fisico Stream.Write(Bytes, 0, 8192) 'Incrementa l'indice di 8192 Index += 8192 'E notifica il progresso bgReceiveFile.ReportProgress(Index * 100 / FileSize) End If Next lblStatus.Text = "File ricevuto ..." Stream.Close() End Sub Private Sub bgReceiveFile_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgReceiveFile.ProgressChanged prgProgress.Value = e.ProgressPercentage End Sub End Class
Cosa sbaglio?![]()
![]()

Rispondi quotando