Usuário com melhor resposta
Erro ao enviar arquivo grande.

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.
- Editado João Paulo [] quarta-feira, 7 de março de 2018 18:08
-
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
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
-
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.
-
Se você que está implementando ambos client e server, porque não realiza o procedimento em dois passos, como um protocolo:
- Client abre conexão e envia uma mensagem informando o tipo de transferência (Arquivo ou String)
- 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.
-
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."
-
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.
-
-
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.
-
-
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
- Editado João Paulo [] quinta-feira, 8 de março de 2018 19:01
-
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- Editado João Paulo [] sexta-feira, 9 de março de 2018 16:18
-
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.
-