Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TidTcpServer,TidTcpClient (https://www.clubdelphi.com/foros/showthread.php?t=32048)

nenufer 25-05-2006 09:32:43

TidTcpServer,TidTcpClient
 
Buenos dias!!!
Vereis tengo que hacer una pequeña aplicacion y estoy un poco estancada. Tengo que pasar archivos de un ordenador a otro por Tcp.
Un ordenador(servidor) lanza una pregunta por la red:¿Ey tienes archivos? y manda tambien su direccion Ip y los ordenadores(clientes) que esten activos y tengan los archivos se los mandan al primero. Se que tengo que utilizar TidTcpServer y TidTcpClient y rellenar la propiedad de defaultPort y la de host la que me llegue. Pero no se por donde empezar,ni como se mandan mensajes por la red... En mi busqueda por el foro si he encontrado algo se me ha pasao por alto. Ya que es verdad que no tengo ni idea.

Si alguien pude ayudarme, gracias de antemano

Sotrono 25-05-2006 13:57:10

Hola, que versión de los componentes Indy usás??.
Porque en la página de los mismos tenes un ejemplo de un chat tcp (es para la version 9).

Bytes!!

seoane 25-05-2006 14:21:05

Cita:

Empezado por nenufer
Un ordenador(servidor) lanza una pregunta por la red:¿Ey tienes archivos? y manda tambien su direccion Ip y los ordenadores(clientes) que esten activos y tengan los archivos se los mandan al primero.

¿A que te refieres con "lanzar una pregunta por la red"? TCP es un protocolo orientado a la conexion, solo puede comunicarse con un equipo a la vez, no puede mandar un mensaje a todos los equipos de la red al mismo tiempo. Quiza lo que estes buscando no sea TCP sino UDP. El protocolo udp si permite mandar un mensaje a toda la red que sera recibido por todos los equipos que esten escuchando.

Yo lo que haria, por ejemplo, seria mandar un mensaje udp usando la direccion de broadcast, dentro del mensaje mandaria mi ip (no seria necesario, pero asi es mas sencillo). Los equipos que estuvieran escuchando obtendria la ip del equipo que "quiere" archivos y se los mandarian, por ejemplo, usando TCP.

No se si te ayude :D o te lie todavia mas

nenufer 25-05-2006 14:52:02

Gracias a los dos por contestar
 
Buenas!! A sotrono decirle que utilizo version 9. Me e bajao el manual, buscare el ejemplo que me has dicho para tener una idea, muchas gracias:)

Y a seoane me has dejao las cosas un poco mas claras para empezar(eso es lo que buscaba). Udp ya habia utilizado asi que algo ya se, solo me falta los Tcp. Muchas gracias tambien:)

nenufer 26-05-2006 09:43:26

Buenos dias otra vez
 
Cita:

Empezado por seoane
Yo lo que haria, por ejemplo, seria mandar un mensaje udp usando la direccion de broadcast, dentro del mensaje mandaria mi ip (no seria necesario, pero asi es mas sencillo). Los equipos que estuvieran escuchando obtendria la ip del equipo que "quiere" archivos y se los mandarian, por ejemplo, usando TCP.

Veras estoy aqui intentandolo y la verdad es que ya no se ni por donde cogerlo, ya que cuando use udp,era udpserver y no tenia client.
Te comento mis dudas:

El udpServer: Es el que tiene los archivos? porque es el que tiene que leer el mensaje que le mandan,no?udpclient no tiene evento para leer.

El udpClient : Es el que manda el mensaje, con el broadCast? El host: que pongo es el host del ordenador que manda el mensaje? porque si es el del servidor, no se como leerlo. He visto el metodo receivedString(); Si es con este en el broadcast el string tendre que poner la direccion ip?

y el broadCast los parametros son un string y un integer. Q el integer pone Aport. Tengo que poner mi direccion ip o el host.?la ip no es string? si es mi direccion ip, hay alguna forma de conseguirla o tengo que ponerla estaticamente??

Como ves estoy llena de dudas.:confused: :confused: :confused:
Cuando parece que me cuadra una cosa la otra que tenia clara se descoloca.
No se si te habre liao,espero que no

Gracias

Gracias

seoane 26-05-2006 11:38:26

Supongo que estas usando los componentes Indy (si no es asi corrigeme), yo no controlo mucho el funcionamiento de estos componentes pero no parece muy complicado. En el IdUDPServer en la propiedad DefaultPort colocas el puerto que quieres usar, Active = TRUE y BroadcastEnable = TRUE. Y en el IdUDPClient colocas tambien el valor del puerto y BroadcastEnable = TRUE.

Para mandar un mensage:
Código Delphi [-]
  idUDPClient1.Send('Hola mundo');


Y para recibirlo en el evento OnUDPRead del UDPServer
Código Delphi [-]
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
  ABinding: TIdSocketHandle);
begin
  // Mostramos el mensage
  ShowMessage(String(PChar(AData)));
end;

De todas formas haber si te responde alguien con mas experiencia con estos componentes, yo cuando he trabajado con UDP ha sido utilizando directamente funciones de la API y no tengo mucha experiencia con Indy.

nenufer 26-05-2006 12:25:55

Buenas. Gracias por conestar otra vez!! Utilizo las indy. Las propiedades mas o menos era lo que tenia mas claro :D . He conseguido centrarme un poco mas. Lo explico por si a alguien le interesa :

El udpclient es el que manda un mensaje por la red con broadCast(Ip,puerto);
La ip la optengo mediante gethostname,gethostbyname,inet_ntoa que estan api de windows.
el udpserver lee este mensaje y se lo asigna a la propiedad host del TCPClient:

Eso es hasta ahora lo que tengo. Luego para conectarme y que consiga las imagenes ya veremos pero me imagino que quedara poco.(eso espero:( )

Muchisimas gracias por tu ayuda.;)

nenufer 29-05-2006 16:54:49

Cita:

Empezado por nenufer
El udpclient es el que manda un mensaje por la red con broadCast(Ip,puerto);
La ip la optengo mediante gethostname,gethostbyname,inet_ntoa que estan api de windows.
el udpserver lee este mensaje y se lo asigna a la propiedad host del TCPClient:

Buenas otra vez!! Esto me lleva de cabeza. Quiero pasar imagenes por Tcp, lo tengo todo montado pero no consigo averiguar como pasar imagenes o stream porque para poder pasar imagenes lo que hago es asignar las imagenes a un TmemoryStream.
He buscado mucho y encontre un hilo escrito por madman que buscaba lo mismo que yo,el problema es que cuando pasa las imagenes,asignadas en el stream, ahi ya me pierdo y ni te digo ya en la otra aplicacion para que las lea.
Ese es mi problema.

Si alguien me puede ayudar otra vez,muchiiiiiiiiiiiisimas gracias:confused: :( .

vespita 31-05-2006 19:19:37

a ver
 
...no es exactameente lo que pides...pero te puede ayudar muxo...es para mandar ficheros con UDP pero no hace ninguna pregunta inicial...cargas el archivo y lo envias a toda la gente q ste conectada en la red... exale un vistazo....(archivo adjunto)


ALGUIEN TIENE EL CODIGO DEL ALGORITMO DE HUFFMANN EN DELPHI????? nos salvariais la vidaaaaaaaaaaaaaaa!!!!

nenufer 05-06-2006 11:53:32

Hola de nuevo
 
Vespita, ya lo solucione, gracias. Se ve que el ultimo mensaje se colo. De todas formas me gustaria ver ese adjunto, pero no aparece:p .

Pero ahora vuelvo a solicitar ayuda. Gracias a seoane consegui pasar el stream, pero ahora ademas me gustaria enviar un string. He utilizado writeln,writeBuffer y no me funciona. No llega el mensaje, pero el stream tampoco. Si lo hago con el writebuffer lo abro y lo cierro pero nada. No entiendo porque no me lo envia.
si alguien me lo puede explicar gracias de antemano
:confused:

kwanbis 09-06-2006 17:15:02

Cita:

Empezado por vespita
ALGUIEN TIENE EL CODIGO DEL ALGORITMO DE HUFFMANN EN DELPHI????? nos salvariais la vidaaaaaaaaaaaaaaa!!!!

tenes que gritar tanto? google es tu amigo

http://www.greatchief.plus.com/chieflz3.zip

nenufer 14-06-2006 12:17:04

Hola
 
Sigo intentando pasar un string por tcp. Y no lo he conseguido. He buscado por el foro y por internet, y he encontrado algo el problema es que lo q hago no me funciona. Si alguien me puede ayudar con el codigo gracias de antemano.

En el tcpclient envio todos los datos. una imagen y un string. Si solo envio la imagen no hay ningun problema, este surge cuando intento pasar el string.

Código Delphi [-]
  try
    if TcpClient.Connected = true  then
      TcpClient.Disconnect;
    TcpClient.Host := Ip;
    TcpClient.Connect();
    TcpClient.WriteLn('Hola');
    TcpClient.WriteStream(ImgStream);
    TcpClient.Disconnect;
  finally
    ImgStream.Free;
  end;

y he probado tambien con write y nada.

Y para leerlo en el tcpserver hago:

Código Delphi [-]
Nombre := AThread.Connection.ReadLn();
showmessage(Nombre)

o he probado tambien
Código Delphi [-]
AThread.Connection.Readln(Nombre);

incluso con readstring.
Con esta ultima me muestra la ventana del showmessage pero vacio.

Con estas lineas el programa no sigue cuando lee el string finaliza y no sigue con todo el codigo que tiene por debajo.
Bueno espero q me pueda ayudar alguien, gracias.


La franja horaria es GMT +2. Ahora son las 17:24:36.

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