Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problemas con Socket (https://www.clubdelphi.com/foros/showthread.php?t=8433)

miguel_fr 22-03-2004 20:15:31

Problemas con Socket
 
:mad: hola me gustaria si pueden ayudarme con un problema que tengo con los socket.
mi "cliente" envia sin problemas los mensajes de texto, y mi "servidor" tampoco tienen problemas en recibir el texto y en el mismo "procedure" puedo contestarle al "cliente" enviandole otro texto. :confused: Mi problema viene a la hora de querer mandarle un texto al "cliente" , cuando a mi se me antoje, por ejemplo tener un boton y que cuando yo lo precione le mande el texto.
Espero que se entienda mi problema y tambien espero recibir alguna ayuda al respecto. hasta luego;)

jachguate 23-03-2004 03:38:09

El servidor regularmente también cuenta con métodos para enviar datos a los diferentes clientes. No has indicado que componente de Sockets usas, asi que es un poco dificil ayudarte, pero si te das una vuelta por el help de los componentes, en su sección de métodos, facilmente los vas a identificar, ya que regularmente son llamados Send* (SendText, SendBuffer, SendInteger) o Write* (WriteStr, WriteBuffer, WriteInteger).

Hasta luego

;)

miguel_fr 23-03-2004 14:06:05

Mas Informacion
 
Bueno ahora paso a mostrar el codigo, asi pueda recibir mas informacion por favor, si no es mucha molestia :D
----------------------------------------------------------------
procedure TCliente.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(' Mi mensaje ' );
end;

como ven, mi cliente tiene un boton, que al ser precionado envia un texto, esto no tiene ningun problema
----------------------------------------------------------------
procedure TServidor.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sMensaje : String;
begin
sMensaje := Socket.ReceiveText;
Socket.SendText(' Contesto con otro mensaje ');
end;

Este es mi servidor, tampoco tengo problemas en leer el mensaje que me envio el cliente ni en enviar un mensaje por parte del Servidor
----------------------------------------------------------------
procedure TServidor.Button1Click(Sender: TObject);
begin
serversocket1.Socket.SendText('mi mensaje del server');
end;

Bueno todo se pudre aqui :mad: , yo lo unico que quiero es enviar un mensaje desde el server, cuando yo presione un simple boton, pero no me funciona

Creo que ahora me podran ayudar un poco mas, este es el unico codigo importante que tienen las aplicaciones, uso el mismo puerto y el host por ahora es el local, no creo que eso influya, porque como dije antes no tengo problemas en enviar atraves del cliente
----------------------------------------------------------------

jachguate 23-03-2004 16:43:56

No lo indicas, pero me imagino que el código no compila. Es importante que te des una vuelta por la guía de estilo, y que te acostumbres a incluir datos que pueden parecerte triviales, pero que son importantes, ya que no es lo mismo que un código no compile a que te eleve una excepción en tiempo de ejecución... y a veces no es tan evidente para quien lee tu mensaje.

Es que un servidor puede tener conectados n clientes. Dado que seguis sin indicar que componentes de socket usas, me es imposible indicarte el método exacto, pero seguramente el servidor tiene una lista de los clientes conectados. Si no, podes mantenerla vos con algun evento de conexión/desconexión. Lo único que queda es elegir con que cliente te vas a comunicar, y enviarle el/los mensajes que te plazcan.

Hasta luego.

;)

miguel_fr 23-03-2004 17:39:48

Con respecto a los componentes socket que utilizo son
TServerSocket y TClientSocket (espero no equivocarme respecto a esto).
Te hise caso y esta ves indique con cual cliente me queria comunicar, de la siguiente forma:

serversocket.Socket.Connections[0].SendText('mensaje');

hasta aqui todo bien, ya logre enviar mi mensaje cuando yo quiera, pero claro yo por ahora estoy probando solamente en un Pc, entiendo que para enviarles el mendaje a otras Pc tendria que cambiar ".Connections[0]." , ahora yo quisiera saber, como puedo indicar la conexion a usar, me gustaria poder indicar el Host de la maquina a la que yo quiero enviarle el mensaje.

jachguate tu me dijiste que "podes mantenerla vos con algun evento de conexión/desconexión" entonces seria en cada conexion que yo detecto guardar una variable que me indique en orden se conecto cada cliente?
:rolleyes:
Se que me hise un trabalengua, pero es que no se como expresarme correctamente, espero me ayuden

DarkByte 23-03-2004 21:22:18

Yo antes también usaba los componentes TClientSocket y TServerSocket... pero probé las indy y la verdad es que "rulan" de maravilla, si no te es necesario utilizar los TClient/Server Socket, te aconsejo que uses las Indy. Son buenísimas!

jachguate 24-03-2004 02:14:57

Mirá de que tipo es Connections... podes crear un arreglo o una lista de ellas, con información que te sea util para localizar al cliente que te interesa luego...

Me imagino también que hay eventos de conexión y desconexión, en los que añadiras y eliminarás elementos de la lista...

Viendo tu código, veo que el componente ya tiene una propiedad array de conexiones... muy probablemente la clase Tconection (o como se llame) ya tenga propiedades o métodos que te ayuden a identificar cada conexión, y no tengas que mantener vos una lista aparte de la que ya mantiene el componente server.

De cualquier forma, es simplemente tarea de desarrollar la lógica para elegir la conexión que te interesa y enviarle los mensajes...

Hasta luego.

;)

miguel_fr 24-03-2004 04:28:55

Cita:

Empezado por DarkByte
Yo antes también usaba los componentes TClientSocket y TServerSocket... pero probé las indy y la verdad es que "rulan" de maravilla, si no te es necesario utilizar los TClient/Server Socket, te aconsejo que uses las Indy. Son buenísimas!

DarkByte, yo soy nuevo en esto de programar con socket y la verdad es que si vi que recomiendan el uso de los indy, pero lo que no me queda claro es "cuando usar socket y cuando indy", espero que "jachguate" no me rete si es que esta pregunta no corresponde a este hilo.
Creo que mejor saco un nuevo hilo con este tema

jachguate 24-03-2004 04:58:10

quizas valga un debate aparte sobre esto, pero bien aqui puedo decirte que las Indy son un Superconjunto de lo que podes usar con la vieja paleta de Internet.

De hecho las indy trae componentes para sockets puros, y componentes que ya encapsulan muchos protocolos estándar, como SMTP, POP3, SNMP, Finger, HTTP, FTP y una larga lista de etceteras... Traen el código fuente y han sido generalmente aceptadas, tanto que desde delphi 6 o 7 se incluyen en los cd's de borland. Si tenes una versión de delphi mas vieja (o queres actualizarte) podes descargar la última versión desde http://www.nevrona.com/indy.

Su arquitectura es muy buena, trae muchos eventos utiles... en general, mi apreciación personal, es que funcionan mucho mejor que los componentes antiguos... son estables y eficientes. El servidor de socket es multihilos... con lo que podes atender a varios clientes concurrentemente, sin ninguna complicación (siempre que programes thread safe, claro esta)... y todos los otros servidores heredan esta característica. En fin, probalos y luego nos contas tu experiencia...

Saludos desde el pais de la eterna primavera...

;)

miguel_fr 01-04-2004 02:35:50

Nuevo Problemita
 
:D primero que nada muchas gracias porque pude solucionar mi problema con su ayuda.
ahora bien, tengo un nuevo problema. Les paso a contar y a tratar de explicarselo bien

1° mi aplicacion cliente / servidor logra una comunicacion como yo queria, ya tengo un control de que pc se conecto en la variable "Nro_Pc", ya que los clientes se conectan al servidor en ordenes distintos y yo necesitaba enviar el mensaje especificando el mensaje, usando el siguiente codigo.

serversocket1.Socket.Connections[Nro_Pc].SendText(mensaje);

2° paso a explicar el metodo que me funciona
2.a Inicio el server .. queda en estado "Escuchando a los clientes"
2.b Inicio los clientes, los cuales le envian al servidor su nombre de host para que este los pueda identificar
2.c No tengo problemas en enviar los mensajes y recibir
:D
3° Hasta aqui todo bien (por ahora), el problema en si es el siguiente
3.a Yo no quiero mantener a la aplicacion "servidor" ejecutandose toda la hora
3.b Los "clientes" si se mantendria ejecutandose a todo momento
3.c Como logro que al ejecutar el "servidor" mi clientes se conecten?
3.d Intente de los siguientes modos
3.d.1 Usando un Timer y la propiedad Serversocket1.Socket.Connected de la siguiente manera
dado un determinado tiempo, si no estaba conectado realizaba un intento de conexion
"Esta solucion no me funciono" :confused: :mad:
3.d.2 Usando Procedure TCliente.ClientSocket1Error
if errorEvent = eeConnect then
clientsocket1.socket.Connect(1);
Lo que yo intentaba hacer es, si me da el error de coneccion, que intente nuevamente conectarse, "En esta solucion mi aplicacion se salia sola, como era de esperar, ya que entra en un ciclo que la mata sola"
:mad: :mad:
3.e "Alguien me podria ayudar con lo planteado hasta aqui?" :confused:
Necesito que me indiquen algun metodo o forma de resolver este problemillo

PD: Lo quisiera resolver utilizando solamente un componente server en el "server" y un cliente en el "cliente" :)

PD2: Me gustaria resolverlo usando solamente los SOCKET (abstenerse fanaticos de los Indy :D ) ya que estoy tratando de aprenderme estos componentes y no quiero pasarme a otros sin antes aver aprendido lo basico.:p

jachguate 01-04-2004 02:45:41

Cita:

Empezado por miguel_fr
abstenerse fanaticos de los Indy

No es que las Indy sean mas básicas o mas avanzadas... es que son mejores, y con ellas podes aprender, en mi opinión personal, mas y mejor.

En fin.

Si solo queres usar un componente cliente y uno servidor, la idea del Timer es la única que pinta para funcionar. Lo que tenes que graduar es el intervalo al que cada cliente intentará conectarse al servidor.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 06:31:41.

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