Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema con Sockets (https://www.clubdelphi.com/foros/showthread.php?t=67523)

jlsc 21-04-2010 13:29:24

Problema con Sockets
 
Hola a todos,

Necesito hacer un programa mediante sockets, la idea es que desde un PC Servidor le envié mensajes a los demás PC Clientes al mismo tiempo. Lo tengo programado de tal manera que cada vez que un PC Cliente se conecte al servidor este almacene la IP del PC Cliente en un Treeview, y cuando se desconecte desaparezca del TreeView hasta aqui todo bien, mando un mensaje a cada PC cliente sin problemas pero cuando hago un bucle para enviar a todos los PC clientes no me funciona solo llegá a uno y luego me da error, me dice no se puede modificar el estado del socket cuando esta activo. Pero como hago cual es la idea? Yo lo tengo programado de la siguiente manera.

procedure TFormMensaje.BitBtn1Click(Sender: TObject);
var
Mensaje, ClientText:String;
NombrePC:String;
k,j: integer;
begin
NombrePC:='';
for k:=0 to (FormServidor.TreeView1.Items.Count - 1) do
begin
ClientText:= FormServidor.TreeView1.items[k].Text;
for j:=1 to 3 do
NombrePC:= NombrePC + ClientText[j];
if (uppercase(NombrePC)='ESH') then {verifico que es un equipo al cual hay que mandarle según su nombre}
begin
FormServidor.ClientSocket1.Host:=ClientText;
FormServidor.ClientSocket1.Port:=21;
FormServidor.ClientSocket1.Active:=True;
if FormServidor.ClientSocket1.Active then
FormServidor.ClientSocket1.Socket.SendText(Memo1.Text + ' : '+ DateToStr(Date) + ' ' + TimetoStr(Time));
Memo1.Clear;
FormMensaje.Close;
end;
NombrePC:='';
enD
end;


Ven el error o cual sería la manera correcta de hacerlo.

Muchas gracias por su valiosa ayuda.

Un saludo

Jorge

eflosten 21-04-2010 17:17:42

Cuando pongas código trata de meterlo entre las etiquetas de código delphi, para que se marque como en el editor y todos lo veamos mejor.

No se mucho sobre sockets, pero por tu código y el error que cuentas, el problema es que intentas modificar el socket (en la segunda vuelta del bucle) sin haber cerrado el de la primera vuelta.
Justo antes del final del for, desactiva el socket.
Código Delphi [-]
...
   NombrePC:='';
   FormServidor.ClientSocket1.Active:=False;
   end;
end;

A ver si te sirve, si no tendras que esperar a que venga alguien con mas conocimientos en estos temas ;)

Saludos

jlsc 21-04-2010 18:01:08

Lo he probado pero no funciona, simplemente ya no manda nada a ninguno, lo he puesto después de sendText y me sale asynchronus socket error. La idea es enviar a uno cerrar el socket luego abrir el socket enviar a otro y luego cerrar asi sucesivamente pero no funciona.:confused:

jlsc 21-04-2010 18:19:57

He detectado que en la parte:

...................
FormServidor.ClientSocket1.Host:=ClientText;
FormServidor.ClientSocket1.Port:=21;
FormServidor.ClientSocket1.Active:=True;
if FormServidor.ClientSocket1.Active then
FormServidor.ClientSocket1.Socket.SendText(Memo1.Text + ' : '+ DateToStr(Date) + ' ' + TimetoStr(Time));
.......................................

FormServidor.ClientSocket1.Active:=True; no me lo pone a true en el watch.

¿alguna idea de porque?

jlsc 21-04-2010 18:53:36

Problema con Socket Client
 
Hola a todos,

Necesito hacer un programa mediante sockets, la idea es que desde un PC Servidor le envié mensajes a los demás PC Clientes al mismo tiempo. Lo tengo programado de tal manera que cada vez que un PC Cliente se conecte al servidor este almacene la IP del PC Cliente en un Treeview, y cuando se desconecte desaparezca del TreeView hasta aqui todo bien, mando un mensaje a cada PC cliente sin problemas pero cuando hago un bucle para enviar a todos los PC clientes no me funciona solo llegá a uno y luego me da error, me dice no se puede modificar el estado del socket cuando esta activo. Pero como hago cual es la idea? Yo lo tengo programado de la siguiente manera.

procedure TFormMensaje.BitBtn1Click(Sender: TObject);
var
Mensaje, ClientText:String;
NombrePC:String;
k,j: integer;
begin
NombrePC:='';
for k:=0 to (FormServidor.TreeView1.Items.Count - 1) do
begin
ClientText:= FormServidor.TreeView1.items[k].Text;
for j:=1 to 3 do
NombrePC:= NombrePC + ClientText[j];
if (uppercase(NombrePC)='ESH') then {verifico que es un equipo al cual hay que mandarle según su nombre}
begin
FormServidor.ClientSocket1.Host:=ClientText;
FormServidor.ClientSocket1.Port:=21;
FormServidor.ClientSocket1.Active:=True;
if FormServidor.ClientSocket1.Active then
FormServidor.ClientSocket1.Socket.SendText(Memo1.Text + ' : '+ DateToStr(Date) + ' ' + TimetoStr(Time));
Memo1.Clear;
FormMensaje.Close;
end;
NombrePC:='';
enD
end;


Ven el error o cual sería la manera correcta de hacerlo.

Muchas gracias por su valiosa ayuda.

Un saludo

Jorge

rgstuamigo 21-04-2010 22:10:16

Segun veo tu código :rolleyes: lo que necesitas es usar el componente ServerSocket y no un ClientSocket.;)
Si lo que deseas es enviar un mensaje a todos los socket clientes desde el socket server pues yo lo haría de ésta forma:
Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
  for i :=0  to ServerSocket1.Socket.ActiveConnections-1 do
     ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);
end;
.
Saludos...:)

rgstuamigo 21-04-2010 22:31:20

Amigo jlsc , no debes repetir las mismas preguntas(Hilos) en varios foros, por favor lee la guía de estilo para conocer las reglas del foro.;)
Aquí ya preguntaste lo mismo, por lo tanto voy a Mover y Unir ambos hilos.;)

jlsc 23-04-2010 10:32:24

He probado y funciona correctamente.

Muchas gracias

Un saludo


La franja horaria es GMT +2. Ahora son las 06:27:54.

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