Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-02-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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;
Responder Con Cita
  #2  
Antiguo 29-02-2008
elopezf elopezf is offline
Miembro
 
Registrado: mar 2007
Posts: 15
Poder: 0
elopezf Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 29-02-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 29-02-2008
elopezf elopezf is offline
Miembro
 
Registrado: mar 2007
Posts: 15
Poder: 0
elopezf Va por buen camino
Smile

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.
Responder Con Cita
  #5  
Antiguo 03-03-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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

Última edición por Playwithfire fecha: 03-03-2008 a las 16:09:26.
Responder Con Cita
  #6  
Antiguo 06-03-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
Aun no he dado con la formula para solucionar el problema, si alguien lo lee y lo sabe por favor que responda, gracias
Responder Con Cita
  #7  
Antiguo 06-03-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 06-03-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
Gracias por el interes, voy a pasarme de Indy 9 a 10 para probarlo.
Responder Con Cita
  #9  
Antiguo 06-03-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 07-03-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 07-03-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Playwithfire Ver Mensaje
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 07-03-2008
Playwithfire Playwithfire is offline
Miembro
 
Registrado: may 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 07-03-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Playwithfire Ver Mensaje
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 Ver Mensaje
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Gestionar un Proyecto por varias personas belpab Varios 33 16-09-2008 15:39:09
grillas simultaneas nikotina Varios 1 24-07-2007 18:55:44
Conexiones simultaneas a un equipo Nasio Windows 6 23-07-2007 22:32:03
ventanas simultaneas ale21alito Varios 3 08-04-2005 17:58:50
DBGrid con varias querys ¿se puede? Walterdf Conexión con bases de datos 5 16-03-2005 12:18:56


La franja horaria es GMT +2. Ahora son las 03:21:41.


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
Copyright 1996-2007 Club Delphi