none
Erro ao enviar arquivo grande. RRS feed

  • Pergunta

  • Boa tarde pessoal, olha eu aqui dinovo. kk Bom vamos la, estou fazendo download de um file por socket e quando eu faço download dos byte de file pequeno "ex 100MB" funciona normalmente, porem quando eu faço em uma arquivo de "600MB" ou maior me da erro.

    Codigo

    Dim Buffer() As Byte = New Byte(SK(sock).ReceiveBufferSize) {} Dim M1 As New MemoryStream While SK(sock).Available Thread.Sleep(1) M1.Write(Buffer, 0, SK(sock).Receive(Buffer)) End While

      RaiseEvent Data(sock, M1.ToArray)
                    M1.Close()
                    M1.Dispose()

    'envia para Data

    O erro ocorre em "

     M1.Write(Buffer, 0, SK(sock).Receive(Buffer))

    E me volta essas informações  

    Erro que me mostra

    Observações

    O uso excessivo de memória gerenciada geralmente é causado por:

    • Lendo amplos conjuntos de dados na memória.

    • Criando entradas de cache excessivas.

    • Fazendo upload ou baixando arquivos grandes.

    • Uso excessivo de expressões ou cordas regulares durante a análise de arquivos.

    • Estado de exibição excessivo.

    • Demasiados dados no estado da sessão ou muitas sessões.

    Creio eu que seja por conta "Fazendo upload ou baixando arquivos grandes." porque so da erro com arquivos de "600MB" ou maior, lembrando que meu codigo usa thereads.

    Gostaria de uma ajuda.  


        
    quarta-feira, 7 de março de 2018 18:04

Respostas

Todas as Respostas

  • João Paulo,

    Você precisa armazenar estes dados em memória (RAM) ou em disco? Caso seja em disco, substitua o MemoryStream por FileStream e envie blocos menores a cada vez.

    Ex: https://stackoverflow.com/a/21261198/1184708


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta João Paulo [] sexta-feira, 9 de março de 2018 16:17
    quarta-feira, 7 de março de 2018 21:49
  • Oi amigo, bom queria armazenar na ram, usando uma variavel como fiz na  MemoryStream, porque eu posso enviar tanto string como files... se eu usa  FileStream nao vai da certo quando eu for enviar string. 

    Por conta que o RaiseEvent Data(sock, M1.ToArray) recebe os bytes ae ele que determina se e um file ou uma msgbox"String" ou outra coisa, só que usando FileStream  ja cria o file de vez e MemoryStream nao aquenta files de mais de 200MB. 

    quinta-feira, 8 de março de 2018 01:39
  • Se você que está implementando ambos client e server, porque não realiza o procedimento em dois passos, como um protocolo:

    1. Client abre conexão e envia uma mensagem informando o tipo de transferência (Arquivo ou String)
    2. Server recebe a mensagem e retorna um OK para que o Client envie os dados efetivamente

    Deste modo você prepara seu server para tratar diferentes tipos de mensagem.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 8 de março de 2018 12:21
  • Eu ja faço isso amigo, ja mando os dados para que saiba o que esta ha receber file ou string. Deixa te mostra.

    Codigo envia o file ou string + os dados, nome e se e file ou string 

    Imports System.Net
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Text
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim Open As New OpenFileDialog
            Open.ShowDialog()
            Dim endPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
            Dim soc As New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
            soc.Connect(endPoint)
            Dim M1 As New MemoryStream
            Dim File As String = Open.FileName
            Dim F As New FileInfo(File)
            Dim Tipo As Byte() = Encoding.Default.GetBytes("File||" & F.Name & "||")
            M1.Write(Tipo, 0, Tipo.Length)
            Dim FileToByte As Byte() = IO.File.ReadAllBytes(File)
            M1.Write(FileToByte, 0, FileToByte.Length)
            soc.Send(M1.ToArray)
            M1.Close()
            M1.Dispose()
            soc.Shutdown(SocketShutdown.Both)
        End Sub
    End Class
    

    Recebe os byte e os dados file ou string

    Imports System.Net
    Imports System.IO
    Imports System.Net.Sockets
    Imports System.Text
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim endPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
            Dim tcpLis As New TcpListener(endPoint)
            tcpLis.Start()
            Dim soc As Socket = tcpLis.AcceptSocket()
            Do
                If soc.Connected = True And soc.Available > 0 Then
                    Dim Buffer(soc.ReceiveBufferSize) As Byte
                    Dim M1 As New MemoryStream
                    While soc.Available
                        Threading.Thread.Sleep(1)
                        M1.Write(Buffer, 0, soc.Receive(Buffer))
                    End While
                    Dim pegar() As String = Split(Encoding.Default.GetString(M1.ToArray), "||") 'sabe quem e ...
                    If pegar(0).Contains("File") Then 'file
                        Dim M2 As New MemoryStream
                        M2.Write(M1.ToArray, pegar(0).Length + pegar(1).Length + 2 * "||".Length, M1.ToArray.Length - pegar(0).Length - pegar(1).Length - 2 * "||".Length)
                        IO.File.WriteAllBytes(Application.StartupPath & "\" & pegar(1), M2.ToArray)
                        M2.Close()
                        M2.Dispose()
                    Else
                        'string
                    End If
                    M1.Close()
                    M1.Dispose()
                    Exit Do
                End If
            Loop
        End Sub
    End Class
    
    Só que continua a duvida, como envia um file maior ....ex 200MB porque Memorystrean não soporta  

    Erro

    Da tanto no cliente quando no server para enviar arquivos grandes ..."Uploading or downloading large files."

     
    quinta-feira, 8 de março de 2018 18:03
  • Não vejo como conseguirá que isto funcione em MemoryStream. Veja esta explicação nesta thread do StackOverflow: https://stackoverflow.com/a/15597139/1184708


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 8 de março de 2018 18:21
  • Não amigo, eu so uso Memorystren porque nao sei o que usa para que funcione ...
    quinta-feira, 8 de março de 2018 18:29
  • Se você tem a opção de usar outro, siga minha dica inicial. Faça o passo inicial utilizando MemoryStream, apenas para receber a mensagem inicial. Depois direcione seu código para outro método que irá receber as informações como FileStream.

    Resumindo, teria que adaptar seu código e incluir esta lógica.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 8 de março de 2018 18:42
  • Vou tentar ...
    quinta-feira, 8 de março de 2018 18:47
  • Amigo fiz como o recomendado ! porem o file fica com 96KB so. ele tem 900MB, e file pequeno vai de boa

    Imports System.Net
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Text
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim Open As New OpenFileDialog
            Open.ShowDialog()
            Dim endPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
            Dim soc As New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
            soc.ReceiveBufferSize = 9999999
            soc.SendBufferSize = 9999999
            soc.SendTimeout = -1
            soc.ReceiveTimeout = -1
            soc.Connect(endPoint)
            Dim M1 As New MemoryStream
            Dim File As String = Open.FileName
            Dim F As New FileInfo(File)
            Dim Tipo As Byte() = Encoding.Default.GetBytes("File||" & F.Name & "||")
            M1.Write(Tipo, 0, Tipo.Length)
            soc.Send(M1.ToArray)
            M1.Close()
            M1.Dispose()
            Do
                If soc.Available > 0 Then
                    Dim Buffer(soc.ReceiveBufferSize) As Byte
                    Dim M2 As New MemoryStream
                    While soc.Available
                        Threading.Thread.Sleep(1)
                        M2.Write(Buffer, 0, soc.Receive(Buffer))
                    End While
                    If Encoding.Default.GetString(M1.ToArray).Contains("File") Then 'file
                        soc.SendFile(File)
                        M2.Close()
                        M2.Dispose()
                        Exit Do
                    End If
                End If
            Loop
        End Sub
    End Class

    Imports System.Net
    Imports System.IO
    Imports System.Net.Sockets
    Imports System.Text
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim endPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
            Dim tcpLis As New TcpListener(endPoint)
            tcpLis.Start()
            Dim soc As Socket = tcpLis.AcceptSocket()
            soc.ReceiveBufferSize = 9999999
            soc.SendBufferSize = 9999999
            soc.SendTimeout = -1
            soc.ReceiveTimeout = -1
            Do
                If soc.Connected = True And soc.Available > 0 Then
                    Dim Buffer(soc.ReceiveBufferSize) As Byte
                    Dim M1 As New MemoryStream
                    While soc.Available
                        M1.Write(Buffer, 0, soc.Receive(Buffer))
                    End While
                    Dim pegar() As String = Split(Encoding.Default.GetString(M1.ToArray), "||") 'sabe quem e ...
                    If pegar(0).Contains("File") Then 'file
                        soc.Send(Encoding.Default.GetBytes("File"))
                        Do
                            If soc.Connected = True And soc.Available > 0 Then
                                Dim FileCreate As New FileStream(Application.StartupPath & "\" & pegar(1), FileMode.Create, FileAccess.ReadWrite)
                                Dim BytesADD As New BinaryWriter(FileCreate)
                                While soc.Available
                                    BytesADD.Write(Buffer, 0, soc.Receive(Buffer))
                                End While
                                FileCreate.Close()
                                FileCreate.Dispose()
                                Exit Do
                            End If
                        Loop
                    Else
                        'string
                    End If
                    M1.Close()
                    M1.Dispose()
                    Exit Do
                End If
            Loop
        End Sub
    End Class


    quinta-feira, 8 de março de 2018 19:00
  • Boa tarde amigo, com muita luta agora entendi o que vc quis dizer com "envie blocos menores". Muito obrigado.

    Seque a solução.

    Imports System.Net
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Text
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim Open As New OpenFileDialog
            Open.ShowDialog()
            Dim endPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345)
            Dim soc As New TcpClient
            soc.Connect(endPoint)
            Dim M1 As New MemoryStream
            Dim File As String = Open.FileName
            Dim F As New FileInfo(File)
            Dim Tipo As Byte() = Encoding.Default.GetBytes("File||" & F.Name & "||")
            M1.Write(Tipo, 0, Tipo.Length)
            soc.Client.Send(M1.ToArray)
            M1.Close()
            M1.Dispose()
            M1 = New MemoryStream
            Do
                If soc.Available > 0 Then
                    Dim Buffer(soc.ReceiveBufferSize) As Byte
                    While soc.Available
                        M1.Write(Buffer, 0, soc.Client.Receive(Buffer))
                    End While
                    If Encoding.Default.GetString(M1.ToArray).Contains("File") Then 'file
                        M1.Close()
                        M1.Dispose()
                        M1 = New MemoryStream
                        Dim FileToByte As Byte() = IO.File.ReadAllBytes(File)
                        For x As Integer = 0 To FileToByte.Length - 1
                            If FileToByte.Length >= 999 Then
                                If x <> FileToByte.Length - 1 Then
                                    If FileToByte.Length - 1 >= x + 999 Then
                                        M1.Write(FileToByte, x, 999)
                                        soc.Client.Send(M1.ToArray)
                                        x += 998
                                    Else
                                        M1.Write(FileToByte, x, 1)
                                        soc.Client.Send(M1.ToArray)
                                    End If
                                Else
                                    M1.Close()
                                    M1.Dispose()
                                    Exit For
                                End If
                            Else
                                M1.Write(FileToByte, x, 1)
                                soc.Client.Send(M1.ToArray)
                            End If
                            M1.Close()
                            M1.Dispose()
                            M1 = New MemoryStream
                        Next x
    
                        soc.Client.Send(Encoding.Default.GetBytes("Acabou"))
                        Exit Do
                    End If
                End If
            Loop
        End Sub
    
    
    End Class
    Agora só parti para arumar o codigo, deixa-lo mais bonito. :)  Likezão para vc amigo, e muito obrigado.
    For x salva vidas kk enviei um file de 908MB    
    sexta-feira, 9 de março de 2018 16:17
  • Show de bola, João Paulo.

    E valeu pelo feedback meu caro.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    sexta-feira, 9 de março de 2018 17:00
  • Eu que agradeço amigo!
    sexta-feira, 9 de março de 2018 17:18