Visual Basic.NET - Envio de varios archivos por la red con networkstream

 
Vista:

Envio de varios archivos por la red con networkstream

Publicado por David Tarifa (1 intervención) el 05/12/2011 10:48:06
Hola a todos.

Tengo una aplicación que envia varios archivos por internet.

Selecciona los archivos con un OpenFileDialog a traves de la propiedad .FileNames y los envía uno tras otro a traves de un socket. Les añade el nombre del archivo a enviar en el primer KByte y los envia a traves de un socket.

El problema esta en que a menudo, de forma aleatoria, no se reciben todos los archivos enviados en el cliente. Si envio 10 archivos, a veces se reciben 7 y a veces solo el primero. Cuando se reciben varios son intercalados, (el primero, el tercero y el cuarto), no consecutivos.

Poniendo el thread.sleep que veis al final si funciona correctamente. Pero no me gusta esta solución. El tiempo de espera va a depender del Pc en el que se ejecute. Y lo que es peor, podría darse el caso de que el tiempo no fuese suficiente, no se recibiesen varios de los archivos y la aplicación ni se enterase. ¿Alguien puede sugerirme otra solución? ¿O algún punto con información de por que no funciona correctamente sin esperas?

Otra duda. Envio archivos de 50K y los recibo de 128Kb, o 2Mbytes, o 4. ¿Alguien puede explicarme por que o como solucionarlo? ¿O algún enlace con información? Uno de los objetivos de la aplicación es minimizar el tamaño de las tramas para hacerlo efectivo con redes lentas, los típicos modems funcionando a 64 o 128kb. La aplicación requiere enviar esos archivos, mostrarlos los pantalla y poder comentarlos por teléfono en ese mismo instante, o sea que tiene que ser casi tiempo real, de ahí el problema del tamaño.

Os paso el código y gracias de antemano.

With SeleccionarArchivos 'OpenFileDialog para seleccionar archivos
.Title = "Seleccione los archivos a enviar"
.Multiselect = True
.InitialDirectory = Application.StartupPath
If .ShowDialog() = Windows.Forms.DialogResult.OK Then 'Si se han seleccionado archivos
Dim archivos() As String = .FileNames 'Obtengo una matriz con los nombres de los archivos
For Each archivo As String In archivos 'Para cada archivo en la matriz
Dim binario(1023) As Byte 'Matriz de bytes a enviar.
binario = System.Text.Encoding.Unicode.GetBytes(Path.GetFileName(archivo)) 'En el primer KByte guardo el nombre del archivo
Dim ruta As New FileStream(archivo, FileMode.Open, FileAccess.Read) 'Abro el archivo
ReDim Preserve binario(ruta.Length + 1024) 'Redimensiono la matriz para que quepa el archivo
ruta.Read(binario, 1024, ruta.Length) 'Añado el archivo a la matriz.
ruta.Close()
Dim FlujoArchivo As NetworkStream = clienteArchivos.GetStream 'Conecto el NetworkStream
Try
FlujoArchivo.Write(binario, 0, binario.Length) 'Envio el NetworkStream
Threading.Thread.Sleep(1000) 'xxxXXXXX Le doy un tiempo o no funciona. XXXXxxx
Catch ex As Exception
MessageBox.Show(ex.Message.ToString)
End Try
Next
End If
End With
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder