Probleme de reception de texte avec TClientSocket

Résolu
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009 - 14 mars 2007 à 12:18
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009 - 15 mars 2007 à 09:09
Bonjour, voilà je suis en train de créer un chat réseau dans le cadre de mes études.

Sur une même form je place mon socket serveur et mon socket client. Ainsi avec le même exe, on peut jouer le rôle de client ou de serveur.

Pour mes tests, je lance 3 fois mon exe :
    _ 1 serveur
    _ 2 clients

La connexion entre eux se fait trés bien : je met le port de connexion sur 2000 (par exemple) et l'adresse IP sur laquelle les clients se connectent 127.0.0.1. Jusque là c'est logique.

Le principe de ce chat est :

_ un client envoie un message au serveur.

procedure TForm2.EnvoieBtnClick(Sender: TObject);
begin
  with form2 do
  begin
  if ZoneFrappe.Text<>'' then
  begin
    ClientSocket1.Socket.SendText(ZoneFrappe.Text);
    ZoneFrappe.Text:= '';
  end;
  end;
end;

_ le serveur reçoit le message et le renvoie à tous les clients connectés

procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var i : integer;
begin
  for i: =0 to ServerSocket1.Socket.ActiveConnections-1 do
  begin
    ServerSocket1.Socket.Connections[i].SendText(Socket.ReceiveText);
    showmessage('message envoyé!');
  end;
end;

_ chaque client reçoit le message qui est affiché dans un memo.

procedure TForm2.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Champ.Lines.add(Clientsocket1.Socket.ReceiveText);
  showmessage('Message reçu!');
end;

Mais dans mes tests seul un client reçoit le message, alors que le serveur l'a bien envoyé 2 fois.
Je m'étais dit que cela pouvait venir du fait que tout était fait en local, mais même aprés avoir testé en mettant un client sur une machine virtuel ça fait la même chose.

Si vous pouviez m'aider, un grand MERCI!

2 réponses

Utilisateur anonyme
15 mars 2007 à 09:04
Salut,

C'est normal que ca plante : l'erreur est içi

procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var i : integer;
begin
  for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
  begin
    ServerSocket1.Socket.Connections[i].SendText(Socket.ReceiveText);
    showmessage('message envoyé!');
  end;
end;

Il se passe quoi :
Ton serveur recoit une donnée : la procédure ServerSocket1ClientRead se déclenche. Premier client, il recherche le texte recu (Socket.ReceiveText) puis l'envoye au client 0. Ensuite il passe au second client, il  recherche le texte recu (Socket.ReceiveText), mais la il recoit plus rien car le texte a déjà été recu donc il envoie rien du tout au client 1.

Voila la modification à faire

procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
i : integer;
Mess:String;
begin
Mess:=ServerSocket1.Socket.ReceiveText;//Déjà première érreur de ta part
  for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
  begin
    ServerSocket1.Socket.Connections[i].SendText(Mess);
    showmessage('message envoyé!');//Inutile et dangereux : ce genre de chose est à éviter sauf pour réaliser un débeugage : en effet la fonction showmessage ne rend pas la main. Ensuite si tu as 5000 clients (ce qui n'est pas énorme), tu vas vite avoir mal au doigt. Le mieux est d'utiliser un ValueListEditor ou DBgrid ou mieux faire un fichier logs.
  end;
end;

Bon coding @+
3
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
15 mars 2007 à 09:09
Merci beaucoup, en effet c'était un problème tout bête :s
Maintenant ça marche parfaitement!

Pour le ShowMessage, j'ai oublié de le virer pour ce post, mais en effet il ne me servait qu'à debugger pour voir combien de tours faisait la boucle For.

Merci bien ;)
0
Rejoignez-nous