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 :
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
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
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
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
   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
Evidemment (si je ne serais pas là), cela ne fonctionne pas...

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.