Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: boy-ka en 20 Junio 2015, 11:07 am



Título: Ayuda error al enviar imagen por socket C#
Publicado por: boy-ka en 20 Junio 2015, 11:07 am
Hola amigos, tengo un servidor y una conexión entre el cliente y el servidor, en el cuál el cliente puede enviar capturas de pantalla al servidor.

El problema es que aveces las imágenes llegan completa, otras veces llegan a mitad, y desde que llega a mitad, cuando vuelvo a tratar de enviar otra imágen aveces los bytes ni llegan bien.

Aquí les dejo el código del cliente y el servidor, a ver si me ayudan por favor he estado muchas horas rompiendome la cabeza a ver que pasa, he llegado a pensar que no capturo los bytes suficiente, pero como ven convierto la cadena a string y luego la convierto a byte con la longitud de bytes que debe tener la imagen, tampoco explicaría el por qué aveces las imagenes llegan bien, bueno aqui el código del cliente:

Código
  1.                //Capturo la imagen de la pantalla
  2.                Bitmap bmCaptura = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
  3.                Graphics captura = Graphics.FromImage(bmCaptura);
  4.                captura.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);
  5.  
  6.                MemoryStream stream = new MemoryStream();
  7.                bmCaptura.Save(stream, ImageFormat.Jpeg);
  8.  
  9.                byte[] byteArray = stream.ToArray();
  10.  
  11.                //Envio los bytes al servidor.
  12.                NetworkStream net = conectarme.send_server;
  13.                net.Write(byteArray, 0, byteArray.Length);
  14.                net.Flush();
  15.  

SERVIDOR:

Código
  1. //Recibo la imagen del cliente y la guardo en un archivo.
  2.                TcpListener server = new TcpListener(IPAddress.Any, puerto);                
  3.                TcpClient client = server.AcceptTcpClient();
  4.                NetworkStream stream = client.GetStream();
  5.                byte[] clientData = new byte[90000000];
  6.                int i = stream.Read(clientData, 0, clientData.Length);
  7.  
  8.                string res = Encoding.Default.GetString(clientData, 0, i);
  9.                byte[] img = Encoding.Default.GetBytes(res);
  10.                File.WriteAllBytes("dataFile.jpg", img);
  11.  

Como he dicho antes, aveces la imagen llega excelente, pero otras veces no, quisiera que me ayuden aunque no tengan la solución pero me den una pista por lo menos, esto me tiene con mucho estrés.

Saludos y gracias de ante mano.

PD: El cliente se logra conectar al servidor, pero me ahorré el código porque estaba en otra clase y me daba palo copiar, pero nah que ver, la conexión se realiza bien, el problema está en el envio de la imagen.

EDITADO POR FALTAS ORTOGRÁFICAS N_N


Título: Re: Ayuda error al enviar imagen por socket C#
Publicado por: El Benjo en 21 Junio 2015, 00:22 am
Yo hice un código hace tiempo precisamente para eso y me funcionaba bien, sólo que yo enviaba la información de forma distinta:

Primero envía un paquete de longitud de 4 bytes (int32) con la longitud en bytes de la imagen que deseas enviar. Después envía los bytes de la imagen.

Del lado del servidor captura primero los 4 bytes del tamaño y después debes comenzar la lectura de los datos y almacenarlos hasta llegar a la longitud deseada. Una vez que has alcanzado la longitud realizas la conversión del flujo de bytes a imagen.

Te dejo el código de envío y lo pruebas. Di si te funciona. El de recepción te lo dejo de tarea. ;)

Código
  1. //Capturo la imagen de la pantalla
  2.                Bitmap bmCaptura = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
  3.                Graphics captura = Graphics.FromImage(bmCaptura);
  4.                captura.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);
  5.  
  6.                MemoryStream stream = new MemoryStream();
  7.                bmCaptura.Save(stream, ImageFormat.Jpeg);
  8.  
  9.                byte[] byteArray = BitConverter.GetBytes(stream.Lenght);
  10.  
  11.                //Envio los bytes al servidor.
  12.                NetworkStream net = conectarme.send_server;
  13. // Primero envío la longitud.
  14.                net.Write(byteArray, 0, 4);
  15.                byteArray = stream.ToArray();
  16. // Después envío los datos.
  17.                net.Write(byteArray, 0, byteArray.Length);
  18.                net.Flush();


Título: Re: Ayuda error al enviar imagen por socket C#
Publicado por: boy-ka en 24 Junio 2015, 09:37 am
Gracias amigo, si me ha funcionado mil gracias!, si quieres te paso el código que le puse al servidor (ya que me lo dejaste como tarea xD)


Título: Re: Ayuda error al enviar imagen por socket C#
Publicado por: El Benjo en 25 Junio 2015, 06:54 am
Jajajajajajajajajajajaja Que bueno que te sirvió.

No te lo voy a calificar, pero en todo caso puedes dejarlo para que le sirva a alguien más... o (habiendo dicho cómo tratar el problema) podemos dejárselo de tarea también a esa persona. XD