Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Idtcpserver puede gestionar varias conexiones simultaneas? (https://www.clubdelphi.com/foros/showthread.php?t=53767)

Playwithfire 29-02-2008 00:27:01

Idtcpserver puede gestionar varias conexiones simultaneas?
 
He encontrado algunas personas q preguntan algo parecido pero tras leer no parece que pregunten lo mismo que yo o no lo entiendo.

Estoy haciendo un programa P2P los usuarios mandan y reciben mensajes, peticiones etc, pero cuando se esta enviando un archivo y la aplicacion lo recibe parece que no deja pasar mas conexiones e impide recibir mas mensajes o archivos simultaneamente, alguien sabe como solucionarlo.

Esta es la zona del evento onexecute del idtcpserver donde parece que esta el problema, listenqueue y maxconnections tienen el varlor de 100 y tengo puesto un componente idantifreeze.

"partes son los trozos que va a recibir del cliente, ya que si hacia sendstream directamente desde el cliente sin enviarlo en partes antes metia toda la stream en memoria"

partes:=tam div bufferenvio;
fStream:=TFileStream.Create(compruebabarrita(downdir)+s,fmCreate);


for x:=0 to partes do begin //Hasta que no sale bloquea las nuevas
Athread.Connection.ReadStream(fStream);
AThread.Connection.WriteLn(respuesta);//Confirmo al cliente recepcion del trozo
end;

elopezf 29-02-2008 01:37:13

Saludos.

Lo que te ha de faltar es un manejador de hilos, que vienen con los componentes Indy.

Revisa los ejemplos de Indy y veras que tiene un manejador de Hilos, asi como el AntiFree.

Yo cree una aplicacion que copiaba toda una base de datos a otra, tabla por tabla y lo que hice es usar un componente Indy TCP Server para recibir la peticiones y un manejador de hilos que asociaba al TCPServer y ademas al momento de recibir una peticion creaba un subhilo de proceso para crear una nueva conexion y procesar los datos.

Espero te sirva: TCPServer + Manejador de Hilos + AntiFreeze y creas una clase para manejo de SubProcesos o SubHilos

Playwithfire 29-02-2008 01:54:02

Perdona mi ignorancia, pero sabes donde podria sacar esa informacion o algunos ejemplos para que yo lo entienda, ya probe enlazar el tcpserver a un threadpool o threadmanager pero realmente no se si hay q implementar algo mas pq sigo teniendo el mismo problema.

De momento al menos se que se puede y me has orientado bastante pero si puedes darme un poco mas de informacion como se hace esto te estaria muy agradecido.

Saludos

elopezf 29-02-2008 17:27:49

Revisa los demos que vienen con Delphi principalmente el que crea un CHAT

C:\Archivos de programa\Borland\Delphi7\Demos\Internet\NetChat


Este demo trabaja con TCPServer y TCPClient, pero lo interesante de esto es que hace uso de un subproceso o subhilo. Para trabajar.

Bueno luego descarga los demos de Indy, los cuales traen un buen de ejemplos muy buenos. Revisalos y junta las 2 formas de hacer los chat y podras obtener un programa P2P como lo necesitas.

http://www.projectindy.org/DemoDownl...os_26Oct04.zip

Suerte.

La cuestion es leer, si no se entiende a la primera, pues volver a leer.

Playwithfire 03-03-2008 15:33:07

La version de delphi 7 que uso no contiene la carpeta demos, hace años cuando usaba delphi 5 si que recuerdo que venian.
He estado dandole vueltas a las demos de Indy pero realmente no se que tengo que hacer, en el Onconnect del idtcpserver de estas demos utiliza una clase que por lo que parece simplifica luego la extraccion de datos del cliente pero no parece que tenga que ver nada con los hilos.

Elopez estoy enganchado en esta parte y necesito algo mas de ayuda.
No se si el componente idtcpserver bloquea las conexiones entrantes hasta que finaliza la que esta dentro o que es lo que ocurre pq recibiendo mensajes no parece bloquearse pero recibiendo un archivo si que lo hace aunque alguna vez si que lo recibe.

Basicamente en el execute ocurre esto...

1-Si la ip del cliente esta registrada en la base de datos da paso (If Ttable.locate...)

2-Lee la cadena que puede ser un mensaje o una orden de envio de archivo

3-Si el cliente envia un archivo entra en un bucle Readstream hasta que se completa el tamaño del archivo, el tamaño lo se pq el cliente se lo ha dicho en la orden. El cliente lo envia en trozos de 32k aunque me he fijado que si
envio en trozos mas pequeños la probabilidad de que llegue un mensaje mientras se envia es mayor.

Llevo 6 meses con este programa estoy bastante ilusionado pero no encuentro la forma de avanzar, tampoco se aun para que se usa iohandler o intercept y como usar el componente de limitacion de ancho sin que me salte una excepcion.

Gracias.

*Uso Indy9

Playwithfire 06-03-2008 02:25:51

Aun no he dado con la formula para solucionar el problema, si alguien lo lee y lo sabe por favor que responda, gracias

jachguate 06-03-2008 06:41:50

Los servidores INDY son multihilos por herencia, y funcionan perfectamente, siempre que sepas lo que estas haciendo.

Con todo respeto, creo que antes de plantearte el desarrollo de un software muy ambicioso, debes tener cierto dominio sobre las tecnologías/técnicas/lenguajes/componentes que formarán el corazón de tu sistema.

Dado que es una pregunta frecuente en los foros, he preparado un ejemplo simple con un servidor y un cliente que te ayudarán a comprobar el funcionamiento multi-hilos de indy. El proyecto usa INDY 10. Lo he hecho con Delphi 2007, pero no debiera presentar mayores problemas para compilar con versiones anteriores de delphi, siempre que tengas instalada INDY 10.

El entorno para realizar la prueba es muy simple:
  • Ejecuta el servidor, pulsa el botón "abrir" para que abra el puerto y configura tu firewall para que permita las conexiones.
  • Ejecuta dos instancias del cliente y ajustalas en tu pantalla para que sean ambas visibles al mismo tiempo
  • En la primera, inicia la transferencia de un archivo grande. (En local, yo he probado enviar un ISO de un CD, para que me de los segundos necesarios para realizar correctamente la prueba).
  • En la segunda, haz unos cuantos PINGS y verás que el servidor responde correctamente (PONG). Inicia la transferencia de otro archivo (mediano o grande) y observa cómo ambas transferencias se realizan simultaneamente.
  • Obviamente, es necesario que ambos clientes se conecten al mismo servidor

La aplicación está en la sección de Ejemplos del ftp y se llama INDY 10-prueba multihilos.zip

Hasta luego.

;)

Playwithfire 06-03-2008 11:19:53

Gracias por el interes, voy a pasarme de Indy 9 a 10 para probarlo.

jachguate 06-03-2008 11:51:43

Si tenes otras (muchas) aplicaciones que usen INDY, será mas sencillo, rápido y económico que trabajes en "bajar de versión" el demo que he hecho, y de paso podrías compartirlo para aquellos que aún usen INDY 9.

Hasta luego.

;)

Playwithfire 07-03-2008 02:17:15

Me paso a indy 10 para probarlo tranquilamente, aunque tu codigo no difiere practicamente nada del mio y a mi me bloquea con indy 9.

jachguate 07-03-2008 02:31:20

Cita:

Empezado por Playwithfire (Mensaje 271463)
aunque tu codigo no difiere practicamente nada del mio y a mi me bloquea con indy 9.

Este codigo, adaptado a INDY 9 funcionaría perfectamente.... en programación multihilos, tenes que andar con pies de plomo... una pequeña distracción y juas!!!

Hasta luego.

;)

Playwithfire 07-03-2008 02:58:21

He usado tu codigo bajo Delphi 7 y Indy 10 y con archivos grandes la memoria se hincha igual q a mi me ocurria 200Mb de memoria en uso y al final el sistema se me cuelga, ademas el Onwork no funciona me da que es mi version de delphi. Tendre que probar con otras a ver.

jachguate 07-03-2008 03:38:14

Cita:

Empezado por Playwithfire (Mensaje 271469)
He usado tu codigo bajo Delphi 7 y Indy 10 y con archivos grandes la memoria se hincha igual q a mi me ocurria 200Mb de memoria en uso

Nunca hablamos del consumo de memoria... además, lo que yo he hecho es solo una prueba de concepto.... se supone que vos partirás el archivo en trozos pequeños y lo transmitirás de esa manera, ¿no?

Cita:

Empezado por Playwithfire (Mensaje 271469)
ademas el Onwork no funciona

Siendo que se usa ese evento solo para añadir una funcionalidad cosmética en el cliente, podríamos ignorarlo totalmente... y verificar si el servidor multihilos funciona o no...
Estoy seguro que tengo una máquina aún por allí con Delphi 7 + Indy 9... la ubicaré en los próximos días y veré yo mismo como me va... :)

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 15:12:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi