Ayuda error al enviar imagen por socket C#

Iniciado por boy-ka, 20 Junio 2015, 11:07 AM

0 Miembros y 1 Visitante están viendo este tema.

boy-ka

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 (csharp) [Seleccionar]

                //Capturo la imagen de la pantalla
                Bitmap bmCaptura = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics captura = Graphics.FromImage(bmCaptura);
                captura.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);

                MemoryStream stream = new MemoryStream();
                bmCaptura.Save(stream, ImageFormat.Jpeg);
               
                byte[] byteArray = stream.ToArray();

                //Envio los bytes al servidor.
                NetworkStream net = conectarme.send_server;
                net.Write(byteArray, 0, byteArray.Length);
                net.Flush();


SERVIDOR:

Código (csharp) [Seleccionar]

//Recibo la imagen del cliente y la guardo en un archivo.
                TcpListener server = new TcpListener(IPAddress.Any, puerto);               
                TcpClient client = server.AcceptTcpClient();
                NetworkStream stream = client.GetStream();
                byte[] clientData = new byte[90000000];
                int i = stream.Read(clientData, 0, clientData.Length);

                string res = Encoding.Default.GetString(clientData, 0, i);
                byte[] img = Encoding.Default.GetBytes(res);
                File.WriteAllBytes("dataFile.jpg", img);


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

El Benjo

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 (csharp) [Seleccionar]
//Capturo la imagen de la pantalla
                Bitmap bmCaptura = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics captura = Graphics.FromImage(bmCaptura);
                captura.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);

                MemoryStream stream = new MemoryStream();
                bmCaptura.Save(stream, ImageFormat.Jpeg);

                byte[] byteArray = BitConverter.GetBytes(stream.Lenght);

                //Envio los bytes al servidor.
                NetworkStream net = conectarme.send_server;
// Primero envío la longitud.
                net.Write(byteArray, 0, 4);
                byteArray = stream.ToArray();
// Después envío los datos.
                net.Write(byteArray, 0, byteArray.Length);
                net.Flush();
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

boy-ka

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)

El Benjo

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
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.