RBonjour à tous.
J'ai dois concevoir un petit serveur TCP/IP multi-thread. Voilà le début :
Maintenant voici la classe Wrapper ServerClientThread :
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public class TCPServer { // Déclaration des délégés public delegate void ClientConnected( int iClientID ); public delegate void ClientDisconnected( int iClientID ); public delegate void ClientErrorOccured( int iClientID, Exception e ); public delegate void ClientDataReceived( int iClientID, byte[] data ); // Déclaration des événements public event ClientConnected OnClientConnected; public event ClientDisconnected OnClientDisconnected; public event ClientErrorOccured OnClientErrorOccured; public event ClientDataReceived OnClientDataReceived; // Déclaration des membres privés private string m_IPAddress = "127.0.0.1"; private int m_PortNumber = 2222; private bool m_bIsRunning = false; private TcpListener m_TCPListener = null; // ... // Événements par défaut private void ClientConnectedEvent( int iClientID ) { if (OnClientConnected != null) OnClientConnected( iClientID ); } private void ClientDataReceivedEvent( int iClientID, byte[] data ) { if (OnClientDataReceived != null) OnClientDataReceived( iClientID, data ); } // ... // Constructeur public TCPServer( string ipAddress, int iPortNumber ) { m_PortNumber = iPortNumber; m_IPAddress = ipAddress; } // Démarrage du server public void Start() { Thread serverThread = new Thread( new ThreadStart( Listen ) ); serverThread.Start(); } // Main loop du serveur private void Listen() { m_bIsRunning = true; m_TCPListener = new TcpListener( System.Net.IPAddress.Parse(m_IPAddress), m_PortNumber ); m_TCPListener.Start(); while( m_bIsRunning ) { // Waiting for a connection Socket clientSocket = null; try { clientSocket = m_TCPListener.AcceptSocket(); } catch (SocketException se ) { ClientErrorOccuredEvent( -1, se ); continue; } // Client connecté if (clientSocket.Connected) { m_ClientID++; // Déclancher l'événement de connection ClientConnectedEvent( newClientID ); // Créer un object ServerClientThread ServerClientThread sct = new ServerClientThread( newClientID, clientSocket ); // Démarage du nouveau processus (gestion du client connecté) Thread serverThread = new Thread( new ThreadStart( sct.Process ) ); serverThread.Start(); // ... } // ... } } }
Alors voilà, je crois bien que ma question est claire
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 public class ServerClientThread { // Déclaration des membres privés private bool m_bStopProcess = false; // ... // Constructeur public ServerClientThread( int iClientID, Socket clientSocket ) { m_ClientID = iClientID; m_ClientSocket = clientSocket; } // Point d'entré du thread public void Process() { while (!m_bStopProcess) { // À partir d'ici je créer un NetworkStream et j'attend les entrées de donnée. Cependant, comment puis-je déclancher l'événement ClientDataReceived de la classe TCPServer qui à démarré ce thread ? Sous C++ j'aurais déclarer cette classe comme étant FRIEND mais en c# ??? } } }
Merci pour votre aide.
Partager