Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con socket y envió de imágenes C#

Estas en el tema de Problema con socket y envió de imágenes C# en el foro de .NET en Foros del Web. Que tal compañeros, traigo un problema, estoy comenzando con C# y estoy haciendo pruebas con sockets en programas cliente/servidor, ya logre enviar y recibir archivos, ...
  #1 (permalink)  
Antiguo 31/12/2010, 06:29
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Problema con socket y envió de imágenes C#

Que tal compañeros, traigo un problema, estoy comenzando con C# y estoy haciendo pruebas con sockets en programas cliente/servidor, ya logre enviar y recibir archivos, mas especifico en imágenes, pero tengo un problema, al principio se me complico mucho porque al parecer el socket envía el archivo (sea cual sea el tipo) en bloques de x bytes, así que siempre recibía solo una parte del archivo (la prueba la hacia con imágenes, con lo cual solo se veía una parte, lo demás de color gris), logré al final eh digamos compaginar (no encuentro otra forma de decirlo) los bloques de bytes y crear el archivo completo, el problema ahora y de plano llevo bastante buscando y no encuentro la razon es que no me llega el archivo completo, lo que pienso es que no obtengo el peso total en bytes en el cliente (o lo obtengo de forma erronea) o de plano la "solución" que implemente esta mal, ya que siempre falta algunos bytes (no mas de 10 en las pruebas que eh hecho), por ejemplo, al enviar una imagen verifico la ventana de propiedades de windows y me marca un peso de 48,758 bytes, pero en el archivo que obtengo al enviarlo me marca 48,750 bytes, como verán faltan 8 bytes...

Si me pudieran ayudar viendo si lo que hice esta bien o de plano regreso a estudiar mas >.<, aquí dejo el código de los programas...

Cliente (el que envía)
Código c#:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net;
  10. using System.Net.Sockets;
  11. using System.IO;
  12. using System.Threading;
  13.  
  14. namespace EnvioArchivos
  15. {
  16.     public partial class Form1 : Form
  17.     {
  18.         bool conectado = false;
  19.         Socket socket;
  20.         Thread trabajo;
  21.  
  22.         public Form1()
  23.         {
  24.             InitializeComponent();
  25.         }
  26.  
  27.         delegate void SetTextCallback(string text);
  28.  
  29.         private void button1_Click(object sender, EventArgs e)
  30.         {
  31.             if (!conectado)
  32.             {
  33.                 conectar();
  34.                 conectado = true;
  35.             }
  36.             else
  37.             {
  38.                 byte[] msn = System.Text.Encoding.ASCII.GetBytes("close");
  39.                 socket.Send(msn);
  40.                 desconectar();
  41.             }
  42.         }
  43.  
  44.         private void button2_Click(object sender, EventArgs e)
  45.         {
  46.             if (openFileDialog1.ShowDialog() == DialogResult.OK)
  47.             {
  48.                 enviarArchivo(openFileDialog1.FileName);
  49.             }
  50.         }
  51.  
  52.         private void conectar()
  53.         {
  54.             button1.Text = "Desconectar";
  55.             button2.Enabled = true;
  56.             button3.Enabled = true;
  57.             textBox3.Enabled = true;
  58.  
  59.             IPAddress ipServer = Dns.GetHostEntry(textBox1.Text).AddressList[0];
  60.             IPEndPoint ipEndPoint = new IPEndPoint(ipServer, 1050);
  61.             socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  62.  
  63.             try
  64.             {
  65.                 addText("Intentando conectar...");
  66.                 socket.Connect(ipEndPoint);
  67.  
  68.                 ParameterizedThreadStart threadMensajes = new ParameterizedThreadStart(this.checarMensajes);
  69.                 trabajo = new Thread(threadMensajes);
  70.                 trabajo.IsBackground = true;
  71.                 trabajo.Start(socket);
  72.  
  73.                 if (socket.Connected)
  74.                 {
  75.                     addText("Conectado!!!");
  76.                 }
  77.             }
  78.             catch (Exception e)
  79.             {
  80.                 addText("Error al intentar conectar \r\n" + e.ToString());
  81.                 button1.Text = "Conectar";
  82.                 button2.Enabled = false;
  83.                 conectado = false;
  84.             }    
  85.         }
  86.  
  87.         private void desconectar()
  88.         {
  89.             //trabajo.Join();
  90.             trabajo.Suspend();
  91.             socket.Close();
  92.  
  93.             addText("Desconectado");
  94.  
  95.             button1.Text = "Conectar";
  96.             button2.Enabled = false;
  97.             button3.Enabled = false;
  98.             textBox3.Enabled = false;
  99.             conectado = false;
  100.         }
  101.  
  102.         private void enviarArchivo(string NombreFichero)
  103.         {
  104.             string RutaFichero = "";
  105.  
  106.             NombreFichero = NombreFichero.Replace("\\", "/");
  107.             while (NombreFichero.IndexOf("/") > -1)
  108.             {
  109.                 RutaFichero += NombreFichero.Substring(0, NombreFichero.IndexOf("/") + 1);
  110.                 NombreFichero = NombreFichero.Substring(NombreFichero.IndexOf("/") + 1);
  111.             }
  112.  
  113.  
  114.             byte[] TamanoFicheroBytes = Encoding.ASCII.GetBytes(NombreFichero);
  115.             if (TamanoFicheroBytes.Length > 99999 * 2024)
  116.             {
  117.                 addText("Tamaño del archivo es más de 200MB, por favor, pruebe con archivos pequeños.");
  118.                 return;
  119.             }
  120.  
  121.             //Msg = "Creando Cache buffer ...";
  122.             byte[] DatosFichero = File.ReadAllBytes(RutaFichero + NombreFichero);
  123.            
  124.             byte[] TamanoFicheroEnviar = new byte[4 + TamanoFicheroBytes.Length + DatosFichero.Length];
  125.             addText("El peso a enviar " + TamanoFicheroBytes.Length.ToString() + " bytes");
  126.  
  127.             addText("Enviando aviso de archivo y su peso");
  128.             byte[] byteAvisoArchivo = Encoding.ASCII.GetBytes("file:" + TamanoFicheroEnviar.Length.ToString());
  129.             socket.Send(byteAvisoArchivo);
  130.  
  131.             byte[] fileNameLen = BitConverter.GetBytes(TamanoFicheroBytes.Length);
  132.  
  133.             fileNameLen.CopyTo(TamanoFicheroEnviar, 0);
  134.             TamanoFicheroBytes.CopyTo(TamanoFicheroEnviar, 4);
  135.             DatosFichero.CopyTo(TamanoFicheroEnviar, 4 + TamanoFicheroBytes.Length);
  136.  
  137.             addText("Enviando archivo...");
  138.             int bytesEnviados = socket.Send(TamanoFicheroEnviar);
  139.             addText("Se enviaron " + bytesEnviados.ToString() + " bytes");
  140.  
  141.             addText("Enviando aviso que se termino de enviar el archivo");
  142.             byte[] byteAvisoEndArchivo = Encoding.ASCII.GetBytes("endfile");
  143.             //socket.Send(byteAvisoEndArchivo);
  144.         }
  145.  
  146.         private void addText(string texto)
  147.         {
  148.             if (textBox2.InvokeRequired)
  149.             {
  150.                 SetTextCallback d = new SetTextCallback(addText);
  151.                 this.Invoke(d, new object[] { texto });
  152.             }
  153.             else
  154.             {
  155.                 string datetime = DateTime.Now.ToString();
  156.                 string[] partes = datetime.Split(' ');
  157.                 string hora = partes[1] + " " + partes[2];
  158.  
  159.                 if (textBox2.Text == "")
  160.                 {
  161.                     textBox2.Text = hora + " " + texto;
  162.                 }
  163.                 else
  164.                 {
  165.                     textBox2.Text = hora + " " + texto + "\r\n" + textBox2.Text;
  166.                 }
  167.             }
  168.         }
  169.  
  170.         private void button3_Click(object sender, EventArgs e)
  171.         {
  172.             if (socket.Connected)
  173.             {
  174.                 enviarTexto(textBox3.Text);
  175.  
  176.                 if (textBox3.Text == "close")
  177.                 {
  178.                     desconectar();
  179.                 }
  180.  
  181.                 textBox3.Text = "";
  182.             }
  183.         }
  184.  
  185.         private void enviarTexto(string texto) {
  186.             if (this.InvokeRequired)
  187.             {
  188.                 SetTextCallback d = new SetTextCallback(enviarTexto);
  189.                 this.Invoke(d, new object[] { texto });
  190.             }
  191.             else
  192.             {
  193.                 byte[] msn = System.Text.Encoding.ASCII.GetBytes(texto);
  194.                 socket.Send(msn);
  195.             }
  196.         }
  197.  
  198.         private void checarMensajes(object orSocket)
  199.         {
  200.             //bool conectado = true;
  201.             int numPasadas = 1;
  202.             Socket socket = (Socket) orSocket;
  203.             addText("Iniciando escucha");
  204.             while (true)
  205.             {
  206.                 if (socket.Connected)
  207.                 {
  208.                     byte[] bytesRecibidos = new byte[1024];
  209.                     int info = socket.Receive(bytesRecibidos);
  210.                     string texto = System.Text.Encoding.ASCII.GetString(bytesRecibidos, 0, info);
  211.  
  212.                     if (texto == "recibido")
  213.                     {
  214.                         addText("Se recibio mensaje del servidor");
  215.                         enviarTexto("endfile");
  216.                     }
  217.                     numPasadas++;
  218.                 }
  219.                 checarMensajesNum(numPasadas.ToString());
  220.             }
  221.  
  222.         }
  223.  
  224.         private void checarMensajesNum(string num)
  225.         {
  226.             if (this.InvokeRequired)
  227.             {
  228.                 SetTextCallback d = new SetTextCallback(checarMensajesNum);
  229.                 this.Invoke(d, new object[] { num });
  230.             }
  231.             else
  232.             {
  233.                 textBox4.Text = num;
  234.             }
  235.         }
  236.     }
  237. }

El código del servidor lo coloco en otro post porque rebazo el limite de caracteres...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #2 (permalink)  
Antiguo 31/12/2010, 06:29
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Problema con socket y envió de imágenes C#

Código del servidor (el que recibe)

Sevidor (el que recibe)
Código c#:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net;
  10. using System.Net.Sockets;
  11. using System.IO;
  12. using System.Threading;
  13.  
  14. namespace RecibirArchivos
  15. {
  16.     public partial class Form1 : Form
  17.     {
  18.         Thread trabajo;
  19.         bool nextDataFile = false;
  20.         string nombreFile;
  21.  
  22.         public Form1()
  23.         {
  24.             InitializeComponent();
  25.         }
  26.  
  27.         delegate void SetTextCallback(string text);
  28.         delegate void SetBytesCallback(int fichero, int ficheroNameLen, string nombre);
  29.  
  30.         private void button1_Click(object sender, EventArgs e)
  31.         {
  32.             ParameterizedThreadStart conexion = new ParameterizedThreadStart(escuchar);
  33.             trabajo = new Thread(conexion);
  34.             trabajo.IsBackground = true;
  35.             trabajo.Start(textBox1.Text);
  36.         }
  37.  
  38.         private void escuchar(object ip)
  39.         {
  40.             IPAddress ipServer = Dns.GetHostEntry((string)ip).AddressList[0];
  41.             IPEndPoint ipEndPoint = new IPEndPoint(ipServer, 1050);
  42.  
  43.             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  44.             socket.Bind(ipEndPoint);
  45.             socket.Listen(100);
  46.  
  47.             addText("Escuchando puerto...");
  48.             Socket conexion = socket.Accept();
  49.             addText("Conectado!!!");
  50.  
  51.             bool conectado = true;
  52.             bool isFile = false;
  53.  
  54.             BinaryWriter ArchivoBinario = null;
  55.             int fileNameLen = 0;
  56.             bool createFile = false;
  57.             string totalSizeFile = "";
  58.             string NombreFichero = "";
  59.             int recibeSizeFile = 0;
  60.  
  61.             while (conectado)
  62.             {
  63.                 if (!isFile)
  64.                 {
  65.                     byte[] bytesRecibe = new byte[1024];
  66.                     int datosRecibe = conexion.Receive(bytesRecibe);
  67.                     addText("Se recibieron " + datosRecibe.ToString() + " bytes");
  68.                     string mensaje = System.Text.Encoding.ASCII.GetString(bytesRecibe, 0, datosRecibe);
  69.                     string[] partes = mensaje.Split(':');
  70.                     if ((string)partes[0] == "file")
  71.                     {
  72.                         addText("Se va a recibir un archivo de " + partes[1] + " bytes");
  73.                         totalSizeFile = partes[1];
  74.                         isFile = true;
  75.                     }
  76.                     else if (mensaje == "close")
  77.                     {
  78.                         conectado = false;
  79.                     }
  80.                     else
  81.                     {
  82.                         addText(mensaje);
  83.                     }
  84.                 }
  85.                 else
  86.                 {
  87.                     byte[] TamanioDatos = new byte[2024 * 99999];
  88.                     addText("Recibiendo archivo...");
  89.                     int BytesRecibidosLen = conexion.Receive(TamanioDatos);
  90.                     recibeSizeFile = recibeSizeFile + BytesRecibidosLen;
  91.                    
  92.                     addText("Se recibieron " + BytesRecibidosLen.ToString() + " bytes");
  93.  
  94.                     if (!createFile)
  95.                     {
  96.                         fileNameLen = BitConverter.ToInt32(TamanioDatos, 0);
  97.                         addText("fileNameLen: " + fileNameLen.ToString());
  98.                     }
  99.                     else
  100.                     {
  101.                         fileNameLen = 0;
  102.                     }
  103.  
  104.                     if (NombreFichero == "")
  105.                     {
  106.                         NombreFichero = Encoding.ASCII.GetString(TamanioDatos, 4, fileNameLen);
  107.                         addText("Obtenemos el nombre del archivo: " + NombreFichero);
  108.                     }
  109.  
  110.                     string rutaArchivo = "D:/prueba/" + NombreFichero;
  111.  
  112.                     if (!createFile)
  113.                     {
  114.                         addText("Creando archivo en disco: " + rutaArchivo);
  115.                         ArchivoBinario = new BinaryWriter(File.Open(rutaArchivo, FileMode.Append));
  116.                         createFile = true;
  117.                     }
  118.  
  119.                     addText("Guardando archivo");
  120.                     ArchivoBinario.Write(TamanioDatos, 4 + fileNameLen, BytesRecibidosLen - 4 - fileNameLen);
  121.  
  122.                     if (recibeSizeFile.ToString() == totalSizeFile)
  123.                     {
  124.                         ArchivoBinario.Close();
  125.                         addText("Archivo recibido y guardado");
  126.                         addText("En total se recibio " + recibeSizeFile.ToString() + " bytes");
  127.                         isFile = false;
  128.                         createFile = false;
  129.                         recibeSizeFile = 0;
  130.                         NombreFichero = "";
  131.                     }
  132.                 }
  133.             }
  134.  
  135.             addText("Cerrando la conexion");
  136.             conexion.Shutdown(SocketShutdown.Both);
  137.             socket.Close();
  138.             addText("Conexion cerrada");
  139.         }
  140.        
  141.         private void addText(string texto)
  142.         {
  143.             if (textBox2.InvokeRequired)
  144.             {
  145.                 SetTextCallback d = new SetTextCallback(addText);
  146.                 this.Invoke(d, new object[] { texto });
  147.             }
  148.             else
  149.             {
  150.                 string datetime = DateTime.Now.ToString();
  151.                 string[] partes = datetime.Split(' ');
  152.                 string hora = partes[1] + " " + partes[2];
  153.  
  154.                 if (textBox2.Text == "")
  155.                 {
  156.                     textBox2.Text = hora + " " + texto;
  157.                 }
  158.                 else
  159.                 {
  160.                     textBox2.Text = hora + " " + texto + "\r\n" + textBox2.Text;
  161.                 }
  162.             }
  163.         }
  164.     }
  165. }

Se me olvidaba una cosa que también me sucede, en un equipo con Windows XP y NET Framework 4 no funciona, abre pero cuando pongo a escucha el servidor se cierra, es necesario instalar las otras versiones de NET Framework?
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 31/12/2010 a las 06:40
  #3 (permalink)  
Antiguo 04/01/2011, 20:04
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Problema con socket y envió de imágenes C#

Por mas que busco no encuentro solución, se siguen perdiendo bytes en los archivos que envió/recibo, alguien tiene por hay algún buen ejemplo de como enviar y recibir datos usando sockets y threads, agradeceré toda ayuda que me puedan dar
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #4 (permalink)  
Antiguo 06/01/2011, 08:02
Avatar de Porlachucha  
Fecha de Ingreso: noviembre-2008
Ubicación: Santiago
Mensajes: 172
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Problema con socket y envió de imágenes C#

mirando el codigo, me llama la atencion el 2024.. esto no es producto de 2 elevado a un entero.. creo que tendria que ser 1024. Aunque no explica nada, puede ser que puedas encontrar los bytes faltantes en esa prueba.
intentalo y comentas.

Saludos
plch
__________________
Nada mas patetico que "detestar" a Intel o Microsoft o Windows o Apple ... apuesto que eres el tipico teton espinilluo y pajero que usa Linux para sentirse capo ...

Etiquetas: socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:51.