Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2004
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Poder: 0
Sr_Sombrero Va por buen camino
Sincronizar ServerSocket y ListView

Estoy programando una aplicación cliente servidor.
La cuestión está en el Server, en este he colocado un listview que muestra las conexiones + datos que envian los clientes.

Haciendo click sobre el listView puedo mandar comandos a los clientes, por eso es importante que el index de los items en el listView esté sincronizado con las conexiones en el Socket.

El problema es que la sincronización no es total ya que a veces un cliente se va sin cerrar la conexión, luego se conecta otro, luego se refrescan las conexiones activas (con un timer que puse) y ya la listView y el socket va cada uno por su lado
Otro problema es que cuando se desconectan los elimino de la listView buscando la IP en el Caption del Item pero podría tener dos conexiones dede la misma IP y solo desconectarse una (ej. si hay dos clientes detrás de un router o en LAN).

Acá les pongo parte del código a ver si me pueden tirar alguna ideita.
Saludos

-----------------------------------

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
lvItem: TListItem;
begin
ListView1.Items.Add.Caption:=Socket.RemoteAddress;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s: string;
lvItem: TListItem;
begin
s:= Socket.ReceiveText;
if copy(s,1,7)='details' then begin
lvItem:= ListView1.FindCaption(0,Socket.RemoteAddress,true,true,false);
if lvItem <> nil then begin
lvItem.SubItems.Add(GetToken(S,';',2));
lvItem.SubItems.Add(GetToken(S,';',3));
lvItem.SubItems.Add(GetToken(S,';',4));
lvItem.SubItems.Add(GetToken(S,';',5));
end;
end;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
lvItem: TListItem;
begin
lvItem:=ListView1.FindCaption(0,Socket.RemoteAddress,true,true,false);
if lvItem <> nil then
lvItem.Delete;
end;

// con el timer les mando texto a los clientes para que el socket
// desconecte a los que se han ido sin avisar.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
i2check:=(i2check+1); {item a checkear}

if ListView1.Items.Count-1<i2check then begin
i2check:=-1;
exit;
end
else
ServerSocket1.Socket.Connections[i2check].SendText('lala');
end;
end;
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:27:48.


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
Copyright 1996-2007 Club Delphi