Bonjour à tous,

Je fais une appli en delphi2010 qui utilise des sockets IP.
Je dois gérer plusieurs accès simultanés et j'utilise le composant TserverSocket.

A chaque connexiotn, l'èvenement OnGetThread
SocketThread := TMyServerThread.Create(False, ClientSocket);

Qui lance la procédure myServerThread.ClientExecute qui envoie à son tour une confirmation de connexion :
ClientSocket.SendText('Welcome ' + ClientSocket.RemoteAddress);

Si je comprends bien le processus, à chaque connection, le programme créée un Thread.

Jusque la tout va bien et ma question est la suivante :

Lorsque j'ai plusieurs connexions simultanées, j'ai donc plusieurs thread qui tournent avec chacun une Socket.

Comment je fais pour envoyer un message à une Socket particulière ?


J'ai essayé de déclarer le tableau suivant :
SocketList: Array[0..100] of TServerClientWinSocket;


Et à chaque création de Thread, j'incrémente nSocket et j'affecte SocketList[nSocket] avec le ClientSocket qui a été créé par le Thread.

Ce qui donne SocketList[nSocket] := ClientSocket;


J'espérais ainsi pouvoir envoyer un message en appelant simplement la fonction

SocketList[nSocket].SendText( 'welcome');

Hélas ça ne fonctionne pas.

Est ce que quelqu'un peut m'aider sur ce sujet ?

Voici un extrait du code que j'utilise :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Unit1 
...
var
  Form1: TForm1;

  SocketList: Array[0..100] of TServerClientWinSocket;
  nSocket: Integer = 0;

implementation



procedure TForm1.MySocketServerGetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread := TmyServerThread.Create(False, ClientSocket);
end;


Procedure TmyServerThread.ClientExecute;
Var
  Data: Array[0..1023] Of ansichar;
  RecText: String;
  SocketStream: TWinSocketStream;
Begin
Setlength(RecText, 9999);

SocketList[nSocket] := ClientSocket;

While Not Terminated and ClientSocket.Connected Do
Try
   SocketStream := TWinSocketStream.Create(ClientSocket, 6000);
   Try
      FillChar(Data, SizeOf(Data), 0);

      If (SocketStream.Read(Data, SizeOf(Data)) = 0)
      Then Begin
           {If no  data after xx seconds then close the connection}
           ClientSocket.SendText('Still connected ? '+#13#10);
           {Wait a little time to allow sending of text before disconnect}
           sleep(3);
           ClientSocket.Close;
           Terminate;
           end

      else begin
           RecText := Data;
           If (Length(RecText) > 2)
              Then Delete(RecText, Pos(#13#10, RecText), 2); // Delete #13#10

           If ClientSocket.Connected
           Then Begin
                   ClientSocket.SendText('Welcome ' +  ClientSocket.RemoteAddress);
                end;
           end;
   Finally
   SocketStream.Free;
   Inc(nSocket);
   end;
   Except
   HandleException;
   end;
end;

Merci d'avance,
Wilco