La Web del Programador: Comunidad de Programadores
 
    Pregunta:  46283 - COMO HACER UNA APLICACION PAR A CHATEAR EN RED LOCAL
Autor:  Rene Leandro Cruz Laguna
Quisiera saber como hacer un programa para chatear en una red local algo dificil verdad soy algo nobato en delphi pero me interesa saber.Sea lgo pero quiero aprender mas

  Respuesta:  Erwin Perez
Hay muchas opciones, pero las englobare primero en dos formas:
1.- Todos los clientes del chat se conectan a un servidor que recibe y envia los mensajes.
2.- Cada uno de los clientes se conecta directamente al cliente que desea enviarle el mensaje.

Por otro lado, para el envio de mensajes, debes considerar un transporte, te puedo mencionar varios:

*Cadenas de caracteres (Aqui debes diseƱar un protocolo) con sockets.
*Comunicacion DCOM.
*Conexiones DCOM con TDCOMConnection
*Conexion DCOM a travez de TSocketConnection
etc. (Te menciono estos tres porque son en los que tengo mas experiencia).

Supongamos que eliges un servidor de despacho, entonces creas una aplicacion, le agregas un objeto TAutomationObject con las siguientes caracteristicas: Instancing: MultipleInstance, Threading Model: Single
y marcas "Generate Event support code", esto hara que puedas lanzar eventos.
Abres el Type Library(View/Type Library), y en la interfase das de alta un metodo para envio de mensaje, pej.: SendMsg y en parametros pones Usuario, Mensaje, etc. Luego en la interfaz de eventos creas un evento para notificar a los clientes del envio, pej. MessageSent, con los mismos parametros de SendMsg, ahora ya tenemos el esqueleto. Lo siguiente es codificar el metodo SendMsg:

TMyServerObject.SendMsg(Usuario, Mensaje: OleVariant);
var
i: Integer;
begin
for i:=0 to FConnections.Count - 1 do
(FConnections.Items[i] as IMyServerObjectEvents).MessageSent(Usuario, Mensaje)

//Esto dispara el evento MessageSent en los clientes pasando los parametros Usuario y Mensaje, los cuales puedes procesar para mostrar el mensaje, claro que tienes que tener una lista de todos los clientes que aqui llame FConnections, ya que cada conexion crea una instancia del servidor, asi que hay que mantener una lista externa. Tenia por ahi el codigo de una implementacion asi pero no lo encuentro, si necesitas esto mas a profundidad podria mandartelo despues.

end;

LADO CLIENTE

Para el cliente, primero importas el servidor en Project/Import Type Library, y eliges crear componente, eso crea un componente en la paleta de componentes con el nombre de tu servidor, lo colocas en tu cliente, este componente te permitira establecer la maquina donde reside (hay que especificar que es remoto) y codificar el evento (en el inspector de objetos) para que decida si el mensaje corresponde al usuario que este usando dicho cliente o no y con ello decide si muestra el mensaje.

Recepcion del mensaje
TMyForm.TMyMessageServer1OnMessageSent(Usuario, Mensaje: OleVariant);
begin
if Usuario = UsuarioActivo then
Memo1.Lines.Add(Mensaje)
end;

Para enviarlo
TMyForm.Button1Click(Sender: TObject);
begin
MyMessageServer1.SendMsg(UsuarioActivo, Memo2.Text);
end;

Espero te sea de ayuda para darte una idea, no es meramente toda la implementacion pero espero te sirva.