Ver Mensaje Individual
  #1  
Antiguo 26-01-2011
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Reputación: 19
casacham Va por buen camino
Cool 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.
__________________
La vida no trata de encontrarse a uno mismo, sino de crearse a uno mismo.
Tanto si piensas que puedes como si no, estarás en lo cierto
Responder Con Cita