Jump to content


Photo

Envio desde Server a Clientes [Componentes INDY][DUDA]


  • Please log in to reply
12 replies to this topic

#1 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 11 July 2012 - 03:37 PM

Hola a todos, que tal ? Bueno, os cuento, estoy aprendiendo usar el INDY, entender su funcionamiento. La verda me cuesta un poco porque estaba acostrumbrado al los componentes antiguos (TClientSocket / TServerSocket) y el Indy es diferente. Bueno, he conseguido programar un pequeño Chat. El server acepta conecciones, guardo el Handle de cada coneccion/socket en AContext.Data y aparte los añado a un Tlistbox para luego identificar las conexiones por si alguien se desconecta y asi borrar desde el control TListbox. El cliente por su parte tambien envia datos perfectamente al servidor. El problema es que no se como enviar datos desde server selecionando a X cliente (por su Handle). Si alguien pudiera iluminarme, le agradeceria mucho. Gracias de antemano.

Saludo  :)
  • 0

#2 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 12 July 2012 - 02:09 PM

Por lo que veo la gente esta igual que yo, gracias de todos modos  :)
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 12 July 2012 - 04:44 PM

Por lo que veo la gente esta igual que yo, gracias de todos modos  :)

Hola Fakedo0r. Ten paciencia, si alguien no te ha respondido no quiere decir que no sepa o que no quiera sino que no ha tenido el tiempo de responder.
Este sitio está hecho por personas que saben como también las que quieren aprender, pero debes entender que ellos también tienen sus obligaciones y por que no... sus complicaciones.
Espera por favor a que alguien que tenga algo más de manejo y conocimiento sobre Indy responda.
Apenas ha pasado un día. Aquí las prisas y las respuestas de urgencias no están permitidas, se ayuda en la medida en que uno puede y cuando puede.
Te invito a conocer las normas de la comunidad y las sugerencias sobre los modos al postear.

Muchas gracias.

Saludos,
  • 0

#4 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 12 July 2012 - 05:24 PM


Por lo que veo la gente esta igual que yo, gracias de todos modos  :)

Hola Fakedo0r. Ten paciencia, si alguien no te ha respondido no quiere decir que no sepa o que no quiera sino que no ha tenido el tiempo de responder.
Este sitio está hecho por personas que saben como también las que quieren aprender, pero debes entender que ellos también tienen sus obligaciones y por que no... sus complicaciones.
Espera por favor a que alguien que tenga algo más de manejo y conocimiento sobre Indy responda.
Apenas ha pasado un día. Aquí las prisas y las respuestas de urgencias no están permitidas, se ayuda en la medida en que uno puede y cuando puede.
Te invito a conocer las normas de la comunidad y las sugerencias sobre los modos al postear.

Muchas gracias.

Saludos,


Disculpa pero no se a que viene tu comentario. A caso te has sentido ofendido ¿? Yo se que la gente tiene sus obligaciones y no esta obligado a responderme pero yo en ningún momento he insistido ni he obligado a nadie a que me responda. Tampoco he metido prisa a nadie, aun así suena absurdo e patético esa norma/frase "Aquí las prisas y las respuestas de urgencias no están permitidas". A parte no se figura nada de eso en "las normas del foro" y tampoco veo alguna infracción de normas por mi parte. De todos modos no te sientas ofendido, no era mi intensión.

Saludo
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 12 July 2012 - 06:57 PM

Disculpa si te ha parecido que se te ha tratado mal, pero es que justo esto:

Por lo que veo la gente esta igual que yo, gracias de todos modos


Se entiende como "Gracias por no responderme, ya me las arreglaré solo, no se preocupen". Es decir, sarcasmo.
Y déjame decirte que "gracias de todos modos" es precisamente la manera más fina de ocultar un comentario despectivo, algo muy habitual en los foros. Si no ha sido tu intención, mil disculpas. Y en vista a que tan sólo ha pasado un día y ya pongas algo como eso salta nuestras alarmas.

Por cierto, lo de prisas y urgencias si está contemplado; el punto 6 sobre sugerencias lo dice:

6. Pequeños detalles que a veces se olvidan

Decir "por favor", "disculpa", y "gracias" son palabras que alientan a brindar mejores respuestas, Delphiaccess se construye con la colaboración altruista de muchas personas y no todos están disponibles las 24 horas. Se respetuoso y no desesperes si no recibes respuesta de forma rápida, te podemos asegurar que las respuestas llegarán de un momento a otro ya que cada día hay mas amigos registrados y por consiguiente más personas con ánimo de ayudar.


Vuelvo a repetir, tranquilidad. Porque el modo en como tu has reaccionado a mis comentarios no son del todo buenos, y ha no desesperarte si no hay respuestas en menos de 24 hrs.
Es un llamado que hacemos en general a todo usuario nuevo que entra.

Espero que ahora entremos con mejor pie.

Saludos,
  • 0

#6 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 13 July 2012 - 04:11 PM

Pon algo del codigo que estas utilizando para analizarlo y ver en que te podemos ayudar
  • 0

#7 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 15 July 2012 - 02:06 PM

Hola, gracias por responder...



delphi
  1. Procedure TFRM_Main.CMD_EscucharClick(Sender: TObject);
  2. Var
  3.   Bindings: TIdSocketHandles;
  4. Begin
  5.   Bindings := TIdSocketHandles.Create(ID_Sock);
  6.  
  7.   If ID_Sock.Active Then
  8.     ID_Sock.Active := False
  9.   Else
  10.   Begin
  11.     Bindings.Clear;
  12.     Bindings.Add.IP := '127.0.0.1';
  13.     Bindings.Add.Port := StrToInt(TXT_Puerto.Text);
  14.  
  15.     ID_Sock.Bindings := Bindings;
  16.     ID_Sock.Active := True;
  17.     TXT_Log.Lines.Add('Server iniciado: 127.0.0.1');
  18.     TXT_Log.Lines.Add('Esperando conecciones...');
  19.  
  20.     Bindings.Free;
  21.   End;
  22. End;
  23.  
  24. Procedure TFRM_Main.ID_SockConnect(AContext: TIdContext);
  25. Begin
  26.   AContext.Data := TObject(AContext.Binding.Handle);
  27.   LB_SockID.Items.Add(IntToStr(Integer(AContext.Data)));
  28.  
  29.   TXT_Log.Lines.Add('Nueva coneccion: ' + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.Port));
  30. End;
  31.  
  32. Procedure TFRM_Main.ID_SockDisconnect(AContext: TIdContext);
  33. Var
  34.   sSock: String;
  35.   I: Integer;
  36. Begin
  37.   sSock := IntToStr(Integer(AContext.Data));
  38.  
  39.   TXT_Log.Lines.Add('Se desconecto: ' + AContext.Binding.PeerIP + ':' + IntToStr(AContext.Binding.Port));
  40.  
  41.   For I := LB_SockID.Count - 1 DownTo 0 Do
  42.     If sSock = LB_SockID.Items.Strings[I] Then
  43.     Begin
  44.       LB_SockID.Items.Delete(I);
  45.       AContext.Data := Nil;
  46.     End;
  47. End;
  48.  
  49. Procedure TFRM_Main.ID_SockExecute(AContext: TIdContext);
  50. Var
  51.   sResponse:  String;
  52.   iSize:      Integer;
  53.   tArrRes:    TStringList;
  54. Begin
  55.   If AContext.Connection.Connected Then
  56.   Begin
  57.     iSize := AContext.Connection.IOHandler.ReadLongInt(True);
  58.     sResponse := AContext.Connection.IOHandler.ReadString(iSize);
  59.  
  60.     TXT_Chat.Lines.Add(IntToStr(AContext.Binding.Handle) + ': ' + sResponse);
  61.   End;
  62. End;




Una breve explicacion, es un pequeño chat, cada vez que acepto conexiones guardo el handle en listbox para luego asi eliminar de la lista los clientes que se desconectan. Hasta ahi todo perfecto, el problema es que no puedo enviar datos desde server a un cliente en concreto.

Con TServerSocket era realmente sencillo:



delphi
  1.   if LST_Clientes.Selected[LST_Clientes.ItemIndex] then
  2.   begin
  3.     Sock.Socket.Connections[LST_Clientes.ItemIndex].SendText(TXT_Texto.Text);
  4.   end;

 

Pero con Indy al parecer es muy diferente. Si alguien pudiera ayudarme, le agradeceria muchisimo.
Perdon por el mal entendido que tuve con el Delphius.

Saludo.
  • 0

#8 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 20 July 2012 - 12:47 PM

Alguna idea?  :)
  • 0

#9 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 21 July 2012 - 12:32 PM

Hola de nuevo, que tal ¿? Bueno ahora que no me venga ningún señor diciendo que meto prisas etc...  ;) En fin he preguntado lo mismo en otros foros y tampoco tenían una respuesta así que después de investigar, probar mil maneras logre hacer exactamente lo que quería. Aquí expongo el código por si alguien tuvo el mismo problema o simplemente interesa saber.



delphi
  1. Var
  2.   tArrCl: TList;
  3. Begin
  4.   tArrCl := ID_Sock.Contexts.LockList;
  5.  
  6.   If LB_SockID.Selected[LB_SockID.ItemIndex] Then
  7.   Begin
  8.     TIdContext(tArrCl[LB_SockID.ItemIndex]).Connection.IOHandler.WriteBufferOpen;
  9.     TIdContext(tArrCl[LB_SockID.ItemIndex]).Connection.IOHandler.Write(Integer(Length(TXT_Texto.Text)));
  10.     TIdContext(tArrCl[LB_SockID.ItemIndex]).Connection.IOHandler.Write(TXT_Texto.Text);
  11.     TIdContext(tArrCl[LB_SockID.ItemIndex]).Connection.IOHandler.WriteBufferClose;
  12.  
  13.     TXT_Chat.Lines.Add('Yo: ' + TXT_Texto.Text);
  14.     TXT_Texto.Clear;
  15.   End;
  16.  
  17.   ID_Sock.Contexts.UnlockList;



Si alguien no entiende el código, avisad y comento las lineas. En todo caso gracias a todas aquellas personas que han pasado por mi post.

Un saludo.  :)
  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 21 July 2012 - 12:59 PM

Amigo, muchas gracias por compartirnos tu solución....


Saludos¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡  (y)  (y)
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 21 July 2012 - 01:03 PM

Hola Fakedo0r, no te preocupes no va a aparecer alguien a meterse prisa.
Mil disculpas si alguien no se pudo dar tiempo, yo se que hay gente en el foro que entiende Indy.
Por lo que he visto estos días, resulta que cada uno está con mucho papelerío de UML (mi caso), y mucho código que picar (el del resto). Y además, justamente se da el caso de que en algunos lugares se dan vacaciones a mitad de año y es posible que quieran tomarse un respiro.

Yo de Indy muy poco se, estoy prácticamente nulo. Si bien vi algunos ejemplos y demos nunca con total dedicación al tema como para saber por donde entrarle a tu duda. Y además hay un punto en contra de Indy. Es una "suite" muy volátil, con cambios que hasta resultan radicales de una versión a otra... por ejemplo la 10 y la 11 tienen sus diferencias y hasta se le conocen algunos bugs.
Si no es una obligación irte por Indy, podrías considerar otras opciones. Aquí los compañeros del foro te pueden recomendar. No estoy totalmente seguro pero he estado viendo que se habla mucho de Curl; pero no estoy muy al tanto de si Curl es sólo para el envio de correo electrónico o si es algo más completo y ofrece un amplio abanico como los componentes Indy.

Por otro lado, edité tu solución para ponerle la etiqueta de delphi. Tu le pusiste la de Pascal ;) Pongo al hilo como RESUELTO, aunque no vendría mal alguna de tus palabras que expliquen tu solución.
Lo que me llama la atención es que la solución pase por hacer un cast mediante el tipo TidContext. Creería, así viendo tu código, que tranquilamente se podría disponer de una variable de dicho tipo y utilizarla:



delphi
  1. var MyIdContext: TidContext;



Posiblemente los componente indy tenga una propiedad o un método que regrese el TidContext para el caso.

Saludos,
  • 0

#12 Fakedo0r

Fakedo0r

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 21 July 2012 - 02:38 PM

Gracias por los comentarios chicos. Delphius, gracias por corregir, puse pascal porque no vi el delphi en la lista  :D Bueno el código como verán realmente no es complejo ni nada, de hecho si saben usar el TIdTCPClient, veran que la parte de crear el buffer, enviar datos y cerrar el buffer es lo mismo, lo único que cambia es cuando obtenemos todas las conexiones activas con el Context.LockList y las guardamos en un TList.
El "MyIdContext: TidContext" lo había probado pero por alguna razón no me daba si no directamente poniendo  TidContext(....)...
Tengo un proyecto usando los componentes TServerSocket / TClientSocket y la verdad, es demasiado código y no hay estabilidad, por eso pensé cambiar los componentes por el de Indy porque he leido por ahi que el Indy tiene mucha más estabilidad. Bueno, gracias nuevamente. Cualquier cosa, comentad.

Un saludo  :).
  • 0

#13 julipo

julipo

    Newbie

  • Miembros
  • Pip
  • 2 posts

Posted 17 July 2013 - 09:19 PM

Genial este tema he podido implementar el servidor y he trabajado con el cliente aunque ahi tengo el problema solo puedo enviar informacion al servidor pero no la puedo recibir

si me pudieras ilustrar sera genial.

de antemano gracias por su ayuda
  • 0




IP.Board spam blocked by CleanTalk.