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
Partager