![]() |
Tema sockets ¿Por qué no se envían todos los datos?
Tengo un servidor que todo lo que le llega lo almacena en un archivo de texto:
y tengo un cliente que envía todo el contenido de un archivo de texto al servidor:
El caso es que no me llegan todos los datos al servidor, sólo unos pocos y me pregunto por qué pasa esto si en teoría se envían todos y cada unos de los caracteres del fichero original. Thanks! |
Has probado con los componentes Indy, a mi personalmente los que vienen con delphi nunca me han inspirado confianza
|
Hola noob, yo si utilice bastante los componentes que vienen con delphi y no tuve problemas. Aunque tambien use los indy y son muy buenos tambien.
En el caso de ejemplo especifico me parece que tu problema puede venir por el lado de la longitud de los archivos. Estos componentes no estan diseñados para la transferencia de archivos, solo de texto o pequeños paquetes. Para el envio de archivos debes utilizar el protocolo FTP. En la coleccion de Indy tienes tanto el cliente como el servidor. Aunque tambien pudes usar los que trae la libreria ICS los tiene que tiene una calidad similar aunque un estilo diferente de uso. Suerte |
La idea era hacerlo con los sockets que trae Delphi por defecto y sí está claro que el problema viene de que envío archivos muy grandes, pienso que debe de existir algún modo de hacerlo como enviando poco a poco el archivo. A ver si alguien me cuenta algo más. Gracias.
|
Bueno, independientemente de la eficacia del componente a utilizar (que al fin y a cabo solo "obedecerá" a la "configuración" del programador), hago énfasis en que el código que utiliza "n00b" :D que envía caracter por caracter el archivo :rolleyes:.
Eso es una practica muy mala, y como yo lo veo es aún mucho peor considerando su algoritmo de recepción de datos, intento explicar el problema; Button1Click abre el archivo y byte por byte envía su contenido al componente ClientSocket1 el cual envía al socket dicho byte, por su parte el SO utilizando el Nagle algorithm va almacenando estos bytes hasta que el tamaño de envío sea el adecuado, cuando esto ocurre el paquete es enviado (Hablamos de un paquete no del archivo entero). En el otro extremo de la conexión ServerSocket1ClientRead recive los datos enviados (no es un caracter ni todo el archivo sino un paquete de dimensión X), y crea/sobrescribe el 'archivo.txt' guardando el paquete. Considérese que cada vez que recibe un dato el archivo es pisado! Para corregir dicho código se puede utilizar un valor X de dimensión mayor a un byte para saber que el archivo debe ser creado, luego enviar los datos sin utilizar el Nagle algorithm (esto configurando el valor TCP_NODELAY del socket), en el otro extremo al recibir un valor mayor a un byte crear el archivo, caso contrario realizar un Append. Este método es muy lento he ineficaz, lo correcto sería enviar el tamaño del archivo primero, luego el contenido del archivo en bloques de tamaño razonable (~4 Kb). Saludos |
Ese es solo alguno de los problemas que puede tener. A eso se le puede sumar a que los paquetes no lleguen en orden, etc, etc.
Por eso insisto que existe un protocolo especifico para este tipo de aplicaciones. Hacerlo con socket es solo intentar reinventar la rueda. |
Cita:
Gracias, era por eso al parecer pero como dices he de mejorar el algoritmo para que sea más eficiente. |
Cita:
|
Cita:
Pero cuando envias muchos datos como lo hace noob cada paquete de esos no tiene ningun indice que lo relaciones respecto a los otros, son independientes. En general llegaran en el orden que los envie, pero no nadie lo garantiza. |
Creo crandel que estas confundido, mientras no se cierre el socket todo lo que envies por el sera recibido en el otro extremo en el mismo orden que lo mandaste, esa es precisamente la diferencia entre un protocolo como TCP y uno como UDP. Otra cosa es que hagas envios abriendo y cerrando sockets, en ese caso no tendrian porque llegar en ningun orden en concreto (tampoco tendria mucho sentido hacerlo asi).
Es mas el protocolo FTP no lo conozco en profundidad, pero el HTTP si, y en este ultimo cuando se envia un fichero (imganes, zip, el mismo texto html) se envia todo junto si ningun otro control en el flujo de datos que el propio TCP que esta por debajo del HTTP. Si como tu dices el protcolo TCP no se encargara de controlar el orden en que llegan los datos a estas alturas la web seria un caos :D |
Cita:
:D // Saludos |
Cita:
|
La franja horaria es GMT +2. Ahora son las 03:17:20. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi