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 22-03-2004
Avatar de miguel_fr
miguel_fr miguel_fr is offline
Miembro
 
Registrado: mar 2004
Ubicación: Santiago del estero, Capital
Posts: 73
Poder: 21
miguel_fr Va por buen camino
Question Problemas con Socket

hola me gustaria si pueden ayudarme con un problema que tengo con los socket.
mi "cliente" envia sin problemas los mensajes de texto, y mi "servidor" tampoco tienen problemas en recibir el texto y en el mismo "procedure" puedo contestarle al "cliente" enviandole otro texto. Mi problema viene a la hora de querer mandarle un texto al "cliente" , cuando a mi se me antoje, por ejemplo tener un boton y que cuando yo lo precione le mande el texto.
Espero que se entienda mi problema y tambien espero recibir alguna ayuda al respecto. hasta luego
Responder Con Cita
  #2  
Antiguo 23-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

El servidor regularmente también cuenta con métodos para enviar datos a los diferentes clientes. No has indicado que componente de Sockets usas, asi que es un poco dificil ayudarte, pero si te das una vuelta por el help de los componentes, en su sección de métodos, facilmente los vas a identificar, ya que regularmente son llamados Send* (SendText, SendBuffer, SendInteger) o Write* (WriteStr, WriteBuffer, WriteInteger).

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
  #3  
Antiguo 23-03-2004
Avatar de miguel_fr
miguel_fr miguel_fr is offline
Miembro
 
Registrado: mar 2004
Ubicación: Santiago del estero, Capital
Posts: 73
Poder: 21
miguel_fr Va por buen camino
Post Mas Informacion

Bueno ahora paso a mostrar el codigo, asi pueda recibir mas informacion por favor, si no es mucha molestia
----------------------------------------------------------------
procedure TCliente.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(' Mi mensaje ' );
end;

como ven, mi cliente tiene un boton, que al ser precionado envia un texto, esto no tiene ningun problema
----------------------------------------------------------------
procedure TServidor.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sMensaje : String;
begin
sMensaje := Socket.ReceiveText;
Socket.SendText(' Contesto con otro mensaje ');
end;

Este es mi servidor, tampoco tengo problemas en leer el mensaje que me envio el cliente ni en enviar un mensaje por parte del Servidor
----------------------------------------------------------------
procedure TServidor.Button1Click(Sender: TObject);
begin
serversocket1.Socket.SendText('mi mensaje del server');
end;

Bueno todo se pudre aqui , yo lo unico que quiero es enviar un mensaje desde el server, cuando yo presione un simple boton, pero no me funciona

Creo que ahora me podran ayudar un poco mas, este es el unico codigo importante que tienen las aplicaciones, uso el mismo puerto y el host por ahora es el local, no creo que eso influya, porque como dije antes no tengo problemas en enviar atraves del cliente
----------------------------------------------------------------
Responder Con Cita
  #4  
Antiguo 23-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
No lo indicas, pero me imagino que el código no compila. Es importante que te des una vuelta por la guía de estilo, y que te acostumbres a incluir datos que pueden parecerte triviales, pero que son importantes, ya que no es lo mismo que un código no compile a que te eleve una excepción en tiempo de ejecución... y a veces no es tan evidente para quien lee tu mensaje.

Es que un servidor puede tener conectados n clientes. Dado que seguis sin indicar que componentes de socket usas, me es imposible indicarte el método exacto, pero seguramente el servidor tiene una lista de los clientes conectados. Si no, podes mantenerla vos con algun evento de conexión/desconexión. Lo único que queda es elegir con que cliente te vas a comunicar, y enviarle el/los mensajes que te plazcan.

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
  #5  
Antiguo 23-03-2004
Avatar de miguel_fr
miguel_fr miguel_fr is offline
Miembro
 
Registrado: mar 2004
Ubicación: Santiago del estero, Capital
Posts: 73
Poder: 21
miguel_fr Va por buen camino
Thumbs up

Con respecto a los componentes socket que utilizo son
TServerSocket y TClientSocket (espero no equivocarme respecto a esto).
Te hise caso y esta ves indique con cual cliente me queria comunicar, de la siguiente forma:

serversocket.Socket.Connections[0].SendText('mensaje');

hasta aqui todo bien, ya logre enviar mi mensaje cuando yo quiera, pero claro yo por ahora estoy probando solamente en un Pc, entiendo que para enviarles el mendaje a otras Pc tendria que cambiar ".Connections[0]." , ahora yo quisiera saber, como puedo indicar la conexion a usar, me gustaria poder indicar el Host de la maquina a la que yo quiero enviarle el mensaje.

jachguate tu me dijiste que "podes mantenerla vos con algun evento de conexión/desconexión" entonces seria en cada conexion que yo detecto guardar una variable que me indique en orden se conecto cada cliente?

Se que me hise un trabalengua, pero es que no se como expresarme correctamente, espero me ayuden
Responder Con Cita
  #6  
Antiguo 23-03-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Yo antes también usaba los componentes TClientSocket y TServerSocket... pero probé las indy y la verdad es que "rulan" de maravilla, si no te es necesario utilizar los TClient/Server Socket, te aconsejo que uses las Indy. Son buenísimas!
__________________
:)
Responder Con Cita
  #7  
Antiguo 24-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Mirá de que tipo es Connections... podes crear un arreglo o una lista de ellas, con información que te sea util para localizar al cliente que te interesa luego...

Me imagino también que hay eventos de conexión y desconexión, en los que añadiras y eliminarás elementos de la lista...

Viendo tu código, veo que el componente ya tiene una propiedad array de conexiones... muy probablemente la clase Tconection (o como se llame) ya tenga propiedades o métodos que te ayuden a identificar cada conexión, y no tengas que mantener vos una lista aparte de la que ya mantiene el componente server.

De cualquier forma, es simplemente tarea de desarrollar la lógica para elegir la conexión que te interesa y enviarle los mensajes...

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 24-03-2004
Avatar de miguel_fr
miguel_fr miguel_fr is offline
Miembro
 
Registrado: mar 2004
Ubicación: Santiago del estero, Capital
Posts: 73
Poder: 21
miguel_fr Va por buen camino
Cita:
Empezado por DarkByte
Yo antes también usaba los componentes TClientSocket y TServerSocket... pero probé las indy y la verdad es que "rulan" de maravilla, si no te es necesario utilizar los TClient/Server Socket, te aconsejo que uses las Indy. Son buenísimas!
DarkByte, yo soy nuevo en esto de programar con socket y la verdad es que si vi que recomiendan el uso de los indy, pero lo que no me queda claro es "cuando usar socket y cuando indy", espero que "jachguate" no me rete si es que esta pregunta no corresponde a este hilo.
Creo que mejor saco un nuevo hilo con este tema
Responder Con Cita
  #9  
Antiguo 24-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

quizas valga un debate aparte sobre esto, pero bien aqui puedo decirte que las Indy son un Superconjunto de lo que podes usar con la vieja paleta de Internet.

De hecho las indy trae componentes para sockets puros, y componentes que ya encapsulan muchos protocolos estándar, como SMTP, POP3, SNMP, Finger, HTTP, FTP y una larga lista de etceteras... Traen el código fuente y han sido generalmente aceptadas, tanto que desde delphi 6 o 7 se incluyen en los cd's de borland. Si tenes una versión de delphi mas vieja (o queres actualizarte) podes descargar la última versión desde http://www.nevrona.com/indy.

Su arquitectura es muy buena, trae muchos eventos utiles... en general, mi apreciación personal, es que funcionan mucho mejor que los componentes antiguos... son estables y eficientes. El servidor de socket es multihilos... con lo que podes atender a varios clientes concurrentemente, sin ninguna complicación (siempre que programes thread safe, claro esta)... y todos los otros servidores heredan esta característica. En fin, probalos y luego nos contas tu experiencia...

Saludos desde el pais de la eterna primavera...

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

Última edición por jachguate fecha: 24-03-2004 a las 05:00:25.
Responder Con Cita
  #10  
Antiguo 01-04-2004
Avatar de miguel_fr
miguel_fr miguel_fr is offline
Miembro
 
Registrado: mar 2004
Ubicación: Santiago del estero, Capital
Posts: 73
Poder: 21
miguel_fr Va por buen camino
Thumbs up Nuevo Problemita

primero que nada muchas gracias porque pude solucionar mi problema con su ayuda.
ahora bien, tengo un nuevo problema. Les paso a contar y a tratar de explicarselo bien

1° mi aplicacion cliente / servidor logra una comunicacion como yo queria, ya tengo un control de que pc se conecto en la variable "Nro_Pc", ya que los clientes se conectan al servidor en ordenes distintos y yo necesitaba enviar el mensaje especificando el mensaje, usando el siguiente codigo.

serversocket1.Socket.Connections[Nro_Pc].SendText(mensaje);

2° paso a explicar el metodo que me funciona
2.a Inicio el server .. queda en estado "Escuchando a los clientes"
2.b Inicio los clientes, los cuales le envian al servidor su nombre de host para que este los pueda identificar
2.c No tengo problemas en enviar los mensajes y recibir

3° Hasta aqui todo bien (por ahora), el problema en si es el siguiente
3.a Yo no quiero mantener a la aplicacion "servidor" ejecutandose toda la hora
3.b Los "clientes" si se mantendria ejecutandose a todo momento
3.c Como logro que al ejecutar el "servidor" mi clientes se conecten?
3.d Intente de los siguientes modos
3.d.1 Usando un Timer y la propiedad Serversocket1.Socket.Connected de la siguiente manera
dado un determinado tiempo, si no estaba conectado realizaba un intento de conexion
"Esta solucion no me funciono"
3.d.2 Usando Procedure TCliente.ClientSocket1Error
if errorEvent = eeConnect then
clientsocket1.socket.Connect(1);
Lo que yo intentaba hacer es, si me da el error de coneccion, que intente nuevamente conectarse, "En esta solucion mi aplicacion se salia sola, como era de esperar, ya que entra en un ciclo que la mata sola"

3.e "Alguien me podria ayudar con lo planteado hasta aqui?"
Necesito que me indiquen algun metodo o forma de resolver este problemillo

PD: Lo quisiera resolver utilizando solamente un componente server en el "server" y un cliente en el "cliente"

PD2: Me gustaria resolverlo usando solamente los SOCKET (abstenerse fanaticos de los Indy ) ya que estoy tratando de aprenderme estos componentes y no quiero pasarme a otros sin antes aver aprendido lo basico.
Responder Con Cita
  #11  
Antiguo 01-04-2004
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 miguel_fr
abstenerse fanaticos de los Indy
No es que las Indy sean mas básicas o mas avanzadas... es que son mejores, y con ellas podes aprender, en mi opinión personal, mas y mejor.

En fin.

Si solo queres usar un componente cliente y uno servidor, la idea del Timer es la única que pinta para funcionar. Lo que tenes que graduar es el intervalo al que cada cliente intentará conectarse al servidor.

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


La franja horaria es GMT +2. Ahora son las 19:36:01.


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