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

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-01-2006
Avatar de NickName
NickName NickName is offline
Miembro
 
Registrado: may 2003
Ubicación: Guerrero, México
Posts: 96
Poder: 22
NickName Va por buen camino
Question Mensaje de cliente a Servidor

Hola.

Despues de buscar varios dias en el foro y no encontrar algo que se paresca a mi problema que tengo me decidi por hacer esta pregunta.

Bueno primero uso Delphi7 y las Indy 9, y me encuentro desarrollando un sistemita para un cyber, Tengo una AplicacionCliente con un TIdTCPClient y tambien una AplicacionServidor con un TIdTCPServer y un TIdThreadMgrDefault.

Código:
 //--- Mi bloc de comunicaciones lo uso en ambas partes (AppServer+AppCliente)
  TComunicacion = record
                 Comando,
                 NombreUsuario,                // Quien manda el mensaje
                 Msg,                          // El Mensaje
                 NombreReceptor: string[100];  // Nombre del Receptor
                 Pc            : Integer;      // Numero de la Pc que envia
               end;
Todo funciona bien puedo mandar informacion desde mi cliente hasta el servidor y del servidor al cliente tambien:
Del cliente al servidor lo hago asi:
Código:
procedure TFrm_Principal.Button1Click(Sender: TObject);
Var
commBlock :TComunicacion;
begin
         //-- Asignar datos del bloc de comunicación
         CommBlock.Comando      := 'MENSAJE';
         CommBlock.NombreUsuario   := Client.LocalName;
         CommBlock.Msg             := 'Hola esto es una prueba :))))';
         CommBlock.NombreReceptor  := 'SERVIDOR';
         CommBlock.Pc              :=Num_Pc;
              // ---- Mandarlo ----
         
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);

end;
Del servidor hacia el cliente hago algo parecido, mi problema es en el procedimiento Execute del Servidor al leer un mensaje del cliente si lo muestro en un Memo en el formulario principal no hay ningun problema pero lo que yo quiero es mostrar el mensaje que el cliente manda en un formulario distinto al principal, cuando muestro el mensaje el servidor se queda colgado y creo que tengo mi cerebro bloqueado ya que no encuentro la forma de mostrar el mensaje en otro formulario sin que mi servidor se cuelgue.... si alguien me puede iluminar un poco se lo agradeceria mucho... les pongo el codigo del procedimiento:
Código:
procedure TFrm_Principal.ServerExecute(AThread: TIdPeerThread);
var
  RecClient: PCliente;
  CommBlock, NewCommBlock: TComunicacion;
  RecThread: TIdPeerThread;
  i: Integer;
begin
  If Not AThread.Terminated And AThread.Connection.Connected Then
    Begin
        AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
        If (CommBlock.Comando = 'MENSAJE') Or (CommBlock.Comando = 'COMANDO') Then
          Begin
                 // es el mismo código para ambas órdenes
               If CommBlock.NombreReceptor = '' Then
                 Begin  // ningún destinatario dado se envia a todos los usuarios
                      NewCommBlock := CommBlock;  // No cambiar nada  ;-))
                      With Clientes.LockList Do
                         Try
                            For i := 0 To Count-1 Do  // interactuar con la lista de clientes
                            Begin
                                 RecClient := Items[i];           //Obtener el objeto cliente                                 RecThread := RecClient.Thread;     // Obtener el hilo del cliente
                                 RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);  // Enviar el paquete
                            End;
                         Finally
                         Clientes.UnlockList;
                      End;
                 End
               Else
                 Begin  //  receptor dado - busquelo y se le envía a él
                     If CommBlock.NombreReceptor = 'SERVIDOR' Then
                       Begin  // destinatario el servidor
                         Paquete:=CommBlock;
                         MostrarMensaje(Paquete); // aqui esta el problema
                       End
                     Else
                       Begin
                           NewCommBlock := CommBlock; // De nuevo no cambiar nada ;-))
                           With Clientes.LockList Do
                               Try
                                  For i := 0 To Count-1 Do
                                  Begin
                                       RecClient:=Items[i];
                                       // No tenemos ninguna función de inicio de sesion por eso usamos el DNS
                                       If RecClient.DNS=CommBlock.NombreReceptor Then
                                          Begin
                                               RecThread:=RecClient.Thread;
                                               RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);
                                          End;
                                  End;
                               Finally
                               Clientes.UnlockList;
                           End;
                       End;
                 End;
          End
        Else
          Begin  // Comando desconocido
               NewCommBlock.Comando := 'MENSAJE';       // El mensaje que debe mostrarse en la pantalla del cliente
               NewCommBlock.NombreUsuario := 'ADMINISTRADOR';  // El nombre del servidor
               NewCommBlock.Msg := 'Comando desconocido: "'+CommBlock.Comando+'"';  
               NewCommBlock.NombreReceptor := '[De vuelta al remitente]'; // innecesario
               AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true);  // y aqui va...
          End;
    End;
end;
el procedimiento que se ejecuta para mostrar la ventana del mensaje:

Código:
Procedure TFrm_Principal.MostrarMensaje(Pak : TComunicacion);
Begin
     Frm_Mensaje.Label1.Caption:= Pak.NombreUsuario;
     Frm_Mensaje.cxMemo1.Lines.Add('Mensaje: ' + Pak.Msg);
     Frm_Mensaje.ShowModal;
End;
__________________
Saludos...
Responder Con Cita
 



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
licencias mysql y firebird elpinjum MySQL 8 13-08-2005 02:52:14
Mandar de Servidor a Cliente INDY TCP m@kio Internet 3 01-08-2005 16:14:35
Conectar cliente y servidor, En cualquier lugar del mundo. JXJ Internet 2 09-05-2005 17:38:21
Captura de la IP del cliente en el servidor de aplicacion (3 capas) loleras Providers 0 02-09-2004 12:50:09
Conexion interbase Servidor Linux Cliente Windows rogeriobeltran Firebird e Interbase 4 18-12-2003 00:36:44


La franja horaria es GMT +2. Ahora son las 15:32:56.


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