Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Curiosa manera de leer mensajes en red (https://www.clubdelphi.com/foros/showthread.php?t=72075)

casacham 26-01-2011 20:47:55

Curiosa manera de leer mensajes en red
 
Buenas a todos. Deseo comentarles que estoy trabajando en un proyecto casero que consiste en una aplicacion de Chat para una red local. Utilizo D2009. En mi proyecto he logrado hacer funcionar el chat. Tengo una aplicacion cliente y otra servidor. Utilizo los componentes TClientSocket y TServerSocket de paleta Internet. Hago correr la aplicacion Server en una pc de la red y los clientes en otras maquinas de la misma red. Hasta aqui todo funciona bien, se conectan y se comunican entre si. El problema esta al hacer la lectura del mensaje enviado en el lado del server.

Asi envio el mensaje
Código Delphi [-]
procedure TForm1.SendTXTClick(Sender: TObject);
var Txt: AnsiString;
begin
  Txt:=AnsiString(edit1.Text);
  if ClientSocket1.Active then
     ClientSocket1.Socket.SendText(txt);
end;

y de esta manera lo lee el server
Código Delphi [-]
 
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  i:integer;
  sRec : string;
begin
  for i := 0 to Server.Socket.ActiveConnections-1 do begin
      with Server.Socket.Connections[i] do begin
             sRec := Socket.ReceiveText;
             if sRec <> '' then
              Memo1.Lines.Add(Socket.RemoteAddress + ' y '+RemoteHost+' ha enviado-> '+sRec) ;          
     end;
  end;
 end;

El problema consiste en que el mensaje aparece como un monton de simbolos raros, yo diria que se trata de letras chinas o japonesas.

Sin embargo, haciendo lo siguiente en la aplicacion cliente, es decir, en la aplicacion que envia el mensaje:
Código Delphi [-]
 
procedure TForm1.SendTXTClick(Sender: TObject);
var Txt: AnsiString;
    i: integer;
begin
  Txt:=AnsiString(edit1.Text);
  if ClientSocket1.Active then begin
     for i := 1 to length(txt) do begin
         sleep(5);
         ClientSocket1.Socket.SendText(txt[i]);
     end;
  end;
end;

El server es capaz de leer el mensaje en forma correcta. La modificacion introducida es la instruccion sleep(5); es decir, fracciono el mensaje y lo envio caracter por caracter. El server al recibirlo de esa forma va insertando en el TMemo linea por linea el mensaje a medida que recibe cada caracter. Que en esta oportunidad se trata de letras, al juntarlas horizontalmente conforman el mensaje.

Me gustaria saber porque ocurre esto?, se trata de un problema de AnsiString y String?

Tambien les comento que utilizando TIdUDPClient y TIdUDPServer no he tenido este inconveniente. Con esos componente funciona muy bien las aplicaciones en el sentido que envio una cadena de texto, por ejemplo "hola" y el servidor me lo muestra tal cual, no en letras chinas como el TServerSocket.

Si alguien tiene alguna sugerencia o idea de que puede ser, agradezco explicacion.

Chris 26-01-2011 21:23:11

Pues realmente es un tema nuevo para mí. Nunca he trabajo con cosas como estas. Están muy lejos de mis conocimientos. Pero yo de tú me hiría a usmear profundamente en las especificaciones del procedimiento SendText y ReceiveText, incluso en su código fuente para entenderle mejor al asunto.

Saludos,
Chris

casacham 01-02-2011 21:07:55

Siguiento la funcion por las entrañas del .PAS
 
Bueno Chris, siguiendo tu consejo he seguido el procedimiento hasta sus partes intimas gracias a ctrl+click en el IDE y me ha llevado a ver que lo que finalmente termina haciendo es enviar un PChar. Lo cual me complica la interpretacion ya que ni siquiera se trata de una cadena de caracteres como String o AnsiString, asi que eso explica una parte, que enviando caracter por caracter llega la frase. Pero no explica porque no se puede enviar toda la cadena junta. Estaria bueno saber si alguien ha logrado hacer una aplicacion de CHAT con esos dos objetos.


La franja horaria es GMT +2. Ahora son las 05:51: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