Hello,
Je découvre actuellement les sockets et leur utilisation.
J'ai suivi de l'exemple simple client/serveur où le client demande l'heure au serveur qui la lui renvoie.
Cela fonctionne fort bien (à ou deux détails près dont la correction fut aisée).
A partir de là, je me suis dit que j'allais testé de conditionné la réponse du serveur en fonction d'un paramètre envoyé par le client.
J'ai donc modifié leur méthode TraitementConnexion du client comme suit :
Et la méthode TraitementConnexion du serveur comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub TraitementConnexion(SocketReception As Socket, prm As String) Console.WriteLine("Connecté, réception de " & prm & ": ") Dim bytes(255) As Byte 'création du tableau de réception Try SocketReception.Send(System.Text.Encoding.ASCII.GetBytes(prm)) 'envoi de la demande SocketReception.Receive(bytes) 'réception de l'information Console.WriteLine(System.Text.Encoding.ASCII.GetString(bytes)) 'affichage de la date ou de l'heure Catch ex As Exception Console.WriteLine("Erreur lors de la réception des données : " & ex.ToString) End Try End Sub
Pour finir, sur le client, je fais ceci pour effectuer les demandes :
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 Private Sub TraitementConnexion(socketEnvoi As Socket) Console.WriteLine("Socket client connecté") Try Dim bytes(255) As Byte socketEnvoi.Receive(bytes) Dim demande As String = System.Text.Encoding.ASCII.GetString(bytes) Console.WriteLine("demande reçue : " & demande) If demande = "heure" Then Console.WriteLine("envoi de l'heure") socketEnvoi.Send(System.Text.Encoding.ASCII.GetBytes(Now.ToLongTimeString)) Else Console.WriteLine("envoie de la date") socketEnvoi.Send(System.Text.Encoding.ASCII.GetBytes(Now.Date.ToShortDateString)) End If 'Dim heure As Byte() = System.Text.Encoding.ASCII.GetBytes(Now.ToLongTimeString) 'convertit l'heure en bytes 'Dim envoi As Integer = socketEnvoi.Send(heure) 'envoie l'heure au client ' Console.WriteLine(envoi & " bytes envoyés au client") Catch ex As Exception Console.WriteLine("Erreur lors de l'envoi du message au socket." & ex.ToString) End Try End Sub
Evidemment (si je ne serais pas là), cela ne fonctionne pas...
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 Dim port As Integer = 8080 Dim ip As String = "127.0.0.1" Sub Main() Dim monSocketClient As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim monEP As IPEndPoint = New IPEndPoint(IPAddress.Parse(ip), port) Console.WriteLine("Socket client initialisé") Try Console.WriteLine("Connexion au serveur...") monSocketClient.Connect(monEP) TraitementConnexion(monSocketClient, "heure") TraitementConnexion(monSocketClient, "date") Catch ex As Exception Console.WriteLine("Erreur lors de la tentative de connexion : " & ex.ToString) End Try If monSocketClient.Connected Then monSocketClient.Close() End If Console.ReadLine() End Sub
Lors du premier appel, le serveur renvoie la date au lieu de l'heure et le deuxième appel semble ne pas recevoir de réponse...
La fenêtre de console du client affiche désespérément "Connecté, réception de date : ".
La fenêtre de console du serveur affiche qu'il reçoit la demande "heure" mais envoie quand même la date et semble ne pas recevoir la deuxième demande.
J'ai donc deux problèmes.
Pourquoi le serveur interprète-t-il mal la demande du client et pourquoi la 2e demande du client ne semble pas parvenir au serveur ?
J'imagine que ça doit être quelque chose de plus ou moins trivial mais vu que je débute avec ces choses que sont les sockets, je tourne un peu en rond.
Merci d'avance.
Partager