FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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; |
|
|
|