Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problema con sockets!!! (https://www.clubdelphi.com/foros/showthread.php?t=5108)

DarkByte 09-11-2003 09:20:14

Sockets: Enviar un mensaje a todos los clientes conectados!!!
 
Hola de nuevo. Tengo un problema:

Estoy haciendo un programa que funcione como un chat para una red. Funciona de modo que un cliente envía la información y el servidor se la devuelve a todo el mundo (o así es como debería funcionar:confused: ), pero no, el servidor solo me devuelve la información al cliente que se la mandó. El código en el que creo que debe de estar el error es el siguiente:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
begin
TextoRecibido := Socket.ReceiveText;
Socket.SendText(TextoRecibido);
txtRecibido.Lines.Add (TextoRecibido);
end;

Aclaración: txtRecibido es un Memo.


Gracias a todos de nuevo, espero su ayuda

Descendents 09-11-2003 13:53:32

Claro, porque tu se lo estas enviando a una IP en concreto.El socket que envia, tiene que apuntar a todas las IPS.

Primero a una y envia, luego a otra y envia y asi.

Bueno realmente lo correcto, seria, utulizar la misma conexion que el cliente te abrio hacia el servidor.

Ejemplo:
SERVIDOR
PC1
PC2
PC3

Paso 1
PC1 abre conexion hacia el servidor.
PC2 abre conexion hacia el servidor.
PC3 abre conexion hacia el servidor.
(es decir se conenectan a la IP del SERVIDOR)

Paso2
PC1 envia mensaje al SERVIDOR.

Paso3
SERVIDOR, envia a traves de la conexion anteriormente abierta por cada uno de los PCS(excepto PC1,claro) hacia el,el mensaje enviado Por PC1

Espero te haya quedado claro.
Un saludo

DarkByte 09-11-2003 17:35:12

Descendents, esos son los pasos que estaba intentando segir, excepto por lo de enviarselos a todo excepto PC1, es decir, el pc1 enviaría la información y la recibiría del SERVIDOR, así sé si ha llegado al servidor la información.


Mi problema está en la parte de consegir que envíe la información a todos, no solo al que se la ha enviado.

De todos modos, muchas gracias, eres el único que ha mostrado interés por mi hilo, de momento. Gracias

Descendents 10-11-2003 00:46:13

Dark byte.
El problema que me dices, es lo que te dije antes.

La solución esta en que tienes que utilizar la conexión que cada pc le abrio al servidor, para enviarle lo que te de la gana desde el servidor a cualquier pc.

Es decir, el servidor no tiene que abrir ninguna conexión.Tan solo tiene que utilizar las conexiones abiertas por cada pc hacia él, para devolverles una respuesta o lo que quieras.

Espero que me entiendas

Suerte

jachguate 10-11-2003 01:02:51

Has visto el código del chat que viene en las demos de las Indy. Creo que te aclarará mucho y te dará ideas para hacer lo que queres.

Hasta luego.

;)

madman 10-11-2003 01:04:09

Seria mas facil que vieras el ejemplo de Chat de las Indy.

Es un chat funcional. Puedes darle una miradita y checar que es lo que no estas haciendo para que te funcione con los sockets o en fin usar este ejemplo para crear el tuyo.

Saludos!

madman 10-11-2003 01:05:59

Oh! :eek:

Por dos minutos! jejeje

jachguate 10-11-2003 01:08:44

Me dicen el más rápido del oeste... jejejeje. :D :D :cool:

__hector 10-11-2003 07:53:15

Si no estas usando Indy, sino los componentes genericos de manejo de sockets de delphi, tienes que hacer un recorrido por todos los clientes conectados al servidor, y repartirle los mensajes a cada uno.

Sucede que cada vez que conectas, el serversocket mantiene una coleccion de las distintas conexiones que tiene establecidas a el, asi que en vez de escribir el codigo:

Código:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
begin
TextoRecibido := Socket.ReceiveText;
Socket.SendText(TextoRecibido);
txtRecibido.Lines.Add (TextoRecibido);
end;

escribirias:

Código:


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
TextoRecibido : String;
m : integer;
begin
TextoRecibido := ServerSocket.ReceiveText;
 for m := 0 to ServerSocket.Socket.ActiveConnections do
      ServerSocket.Socket.Connections[m].SendText(TextoRecibido);

txtRecibido.Lines.Add (TextoRecibido);
end;


DarkByte 11-11-2003 19:37:50

Gracias!!, probaré esto último y ahora os cuento. Y por cierto..., no uso las Indy.

"Muxas ashias";)

DarkByte 14-11-2003 19:21:24

No me funciona!!, me da error nada mas recibir el serversocket el texto!! :'(.

Estoy trabajando en un ordenador sin internet... no se si eso influirá algo..

__hector 14-11-2003 20:04:05

Cual es el error que da?

Fe de errata, en vez de ser ActiveConnections es ActiveConnections - 1

DarkByte 14-11-2003 20:50:19

Ah, vale, lo probaré, de todos modos, si me pudiese comentar el codigo... mejor, así aprendería mas, que es lo que me interesa fundamentalmete, gracias

DarkByte 18-11-2003 19:42:17

Me sigue dando fallos...,:( me dice:
Cita:

Project Messenger.exe raised exception class ESocketError with message "Windows socket error: No se ha permitido una peticíón para enviar o recibir datos ya que el socket no está conectado y no se ha proporcionado ninguna direción, al realizar el envío en un socket datagramas por medio de una llamada sendto (10057), on API 'recv". Procces stopped, Use Step or Run to continue...
¿Tendrá algo que ver que no tenga ese ordenador conectado a internet?.

Gracias por adelantado... y si alguien me pudiese, además de responderme, explicarme cómo funciona el código..., se lo agradecería de verdad.

madman 20-11-2003 19:04:08

Comentas que es para una RED. Pero...
¿Tu aplicacion servidor/cliente necesita el internet para poder conectarse?

__hector 21-11-2003 03:28:10

Puedes, dentro del for, verificar si el cliente esta conectado al servidor.

Aunque esta supuesto a encontrar cada conexion en el arreglo, tomando en cuenta la propiedad ActiveConnections, no se si cuando uno de los clientes se desconecta el reorganiza el indice de clientes conectados.

DarkByte 21-11-2003 09:56:40

Madman, no se. Lo digo porque en la red se que se pueden abrir puertos y enviar información..., sin embargo no se si en un pc sin internet y sin conexión a red funciona mi programa igual que en el de la red.

Las pruebas las hago en el ordenador sin red e internet, ya que el modem usb de telefónica no me funciona en este.

jachguate 21-11-2003 18:21:29

Cualquier programa de red debe funcionar, incluso si tu máquina no esta en ninguna red, siempre y cuando se hayan instalado al menos un controlador de red y los protocolos que querras utilizar.

Eso si, si tu programa se conectará a un servidor que no está accesible, pues no funcionará.

Internet, desde el punto de vista de redes, simplemente es una serie de nodos mas.

Hasta luego.

;)

madman 21-11-2003 20:52:07

Si tienes tu aplicacion en una computadora sin red, creo que puedes conectarte a tu misma computadora. :D

Yo asi hice una aplicacion pequeña (server and workstation) que desde el cliente manda al servidor todo lo que se escribe al servidor (ya se los sermones de etica y privacidad :rolleyes: ) pero para poder saber si funcionaba nada mas utilizaba la IP de mi makina en si misma.

Si tienes un adaptador de red yo creo que colocandole una IP X puede funcionar, asi como te digo.

Tal vez... :p

guillotmarc 05-12-2003 21:09:44

Prueba en la línea de comandos :

ping localhost

Si te indica que hay respuesta, entonces el equipo tiene bien configurado el protocolo TCP/IP.

En caso negativo, tienes que instalar en la maquina un adaptador de red (puedes simularlo instalando el adaptador Microsoft loopback adapter, en Windows XP veo que se llama Adaptador de bucle invertido de Microsoft). Una vez instalado el adaptador (tarjeta de red), tienes que instalar y configurar el protocolo TCP/IP.

Respecto a programar la aplicación, aunque nunca he programado nada de este tipo, es muy probable que tengas que ejecutar a la vez el cliente y el servidor, puesto que sino, si pruebas el cliente no podrá conectarse a ninguna parte.

NOTA: Ejecuta la parte servidor en la misma maquina, y en la parte cliente especifica localhost como dirección a la que te quieres conectar.

Saludos.


La franja horaria es GMT +2. Ahora son las 15:19:29.

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