Bonjour à tous,

Je suis confronté a un problème que je n'arrive malheureusement pas à résoudre.

Alors voilà, j'ai une class "Serveur", et une classe "Client" contenant des sockets avec lesquels j'envoi et reçoi des message. Mon problème est le suivant : Lors de l'envoi d'un message du client vers le serveur, le premier envoi s'effectue correctement (Par exemple, j'envoi BONJOUR, le serveur reçois bien BONJOUR). La ou ça coince, c'est si dans un second temps, j'envoi APPHELLO, le serveur reçois : HELLOUR !

Voici les class en question :

Le serveur :

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Namespace Server
    Public Class ServerClass
        Private SocketServer As Socket
        Private SocketClient As Socket
        Private LocalsocketClientIsShutingDown As Boolean = False
        Private readbuf As Byte()
        Private sendbuf As Byte()
        Public infos As ClassInfos
        Public ipAddr As IPAddress
        Private Delegate Sub DelegateDisplay(ByVal message As String)
        Private dlgDisplay As DelegateDisplay = New DelegateDisplay(AddressOf DisplayMessage)
 
        Public Sub New(ByVal _eventLog As EventLogEntry)
            infos = New ClassInfos
            Me.infos.m_eventLog = _eventLog
            Me.readbuf = New Byte(100) {}
        End Sub
        Public Sub RunServer()
            Me.SocketServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Me.SocketServer.Bind(New IPEndPoint(ipAddr, 48888))
            Me.SocketServer.Listen(100)
            Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
            DisplayMessage("Serveur lancé")
        End Sub
        Private Sub ConnectionAcceptCallback(ByVal asyncResult As IAsyncResult)
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                If Not (socket.Handle.ToInt32 = -1) Then
                    Me.SocketClient = socket.EndAccept(asyncResult)
                    Me.LocalsocketClientIsShutingDown = False
                    DisplayMessage("Un client s'est connecté")
                    Me.readbuf = New Byte(100) {}
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
                End If
            Catch ex As SocketException
                DisplayError(ex.Message)
            End Try
        End Sub
        Public Sub ReceiveMessage()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.readbuf = New Byte(100) {}
                Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
            Else
                DisplayMessage("Client non connecté")
            End If
        End Sub
        Private Sub ReceiveMessageCallback(ByVal asyncResult As IAsyncResult)
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim read As Integer = socket.EndReceive(asyncResult)
                If read > 0 Then
                    DisplayMessage("Client dit : " + Encoding.UTF8.GetString(Me.readbuf))
                    '----------------------------------------------------------------------------------------------
                    Dim request As String = Encoding.UTF8.GetString(Me.readbuf)
                    request = request.Replace(vbNullChar, "")
                    '------------------------------------------------------------------------------------------------
                    buffer.SetByte(Me.readbuf, 0, 0)
                    '----------
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveMessageCallback, Me.SocketClient)
                End If
                If read = 0 AndAlso Not Me.LocalsocketClientIsShutingDown Then
                    socket.Close()
                    DisplayMessage("Socket distante fermée.")
 
                    Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
                End If
            Catch ex As SocketException
                DisplayError(ex.Message)
            End Try
        End Sub
        Public Sub Send(ByVal message As String)
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.sendbuf = Encoding.ASCII.GetBytes(message)
                Me.SocketClient.BeginSend(Me.sendbuf, 0, Me.sendbuf.Length, SocketFlags.None, AddressOf SendCallback, Me.SocketClient)
            Else
                DisplayMessage("Client non connecté")
            End If
        End Sub
        Private Sub SendCallback(ByVal asyncResult As IAsyncResult)
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim send As Integer = socket.EndSend(asyncResult)
                DisplayMessage("Message envoyé (" + send.ToString() + " octets)")
            Catch ex As SocketException
                DisplayError(ex.Message)
            End Try
        End Sub
        Public Sub CloseClient()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.LocalsocketClientIsShutingDown = True
                Me.SocketClient.Shutdown(SocketShutdown.Both)
                Me.SocketClient.Close()
                Me.SocketServer.BeginAccept(AddressOf ConnectionAcceptCallback, Me.SocketServer)
            End If
            DisplayMessage("Client arrêté")
        End Sub
        Public Sub CloseServer()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                CloseClient()
            End If
            If Not (Me.SocketServer Is Nothing) AndAlso Not (Me.SocketServer.Handle.ToInt32 = -1) Then
                Me.SocketServer.Close()
            End If
            DisplayMessage("Serveur arrêté")
        End Sub
        Private Sub DisplayMessage(ByVal message As String)
            infos.MyLog.WriteEntry(message, EventLogEntryType.Information)
        End Sub
        Private Sub DisplayError(ByVal message As String)
            infos.MyLog.WriteEntry(message, EventLogEntryType.Error)
        End Sub
    End Class
End Namespace
Client :
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
91
92
93
94
95
96
97
98
99
 
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Namespace Client
    Public Class ClientClass
        Private SocketClient As Socket
        Private LocalsocketClientIsShutingDown As Boolean
        Private readbuf As Byte()
        Private sendbuf As Byte()
        Private listview As ListView
        Private Delegate Sub DelegateDisplay(ByVal message As String)
        Private dlgDisplay As DelegateDisplay = New DelegateDisplay(AddressOf DisplayMessage)
        Private currentProcess As Process
        Public Sub New(ByVal list As System.Windows.Forms.ListView)
            listview = list
            readbuf = New Byte(100) {}
            currentProcess = Process.GetCurrentProcess
        End Sub
        Public Sub ConnectToServer(ByVal ServerName As String)
            If Me.SocketClient Is Nothing OrElse Not Me.SocketClient.Connected Then
                Me.SocketClient = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
 
                Me.SocketClient.BeginConnect(New IPEndPoint(IPAddress.Parse("192.168.60.2"), 48888), AddressOf ConnectCallback, Me.SocketClient)
            Else
                Dim obj As String() = New String() {"Déjà connecté au serveur"}
                listview.Invoke(dlgDisplay, obj)
            End If
        End Sub
        Private Sub ConnectCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Me.SocketClient = socket
                socket.EndConnect(asyncResult)
                obj = New String() {"Connecté au serveur"}
                'frmMain.func.WriteLog(4, obj(0))
                'listview.Invoke(dlgDisplay, obj)
                Me.LocalsocketClientIsShutingDown = False
                Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
            Catch ex As SocketException
                obj = New String() {ex.Message}
                listview.Invoke(dlgDisplay, obj)
            End Try
        End Sub
        Public Sub SendMessage(ByVal message As String)
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.sendbuf = New Byte(100) {}
                Me.sendbuf = Encoding.UTF8.GetBytes(message)
                Me.SocketClient.BeginSend(Me.sendbuf, 0, Me.sendbuf.Length, SocketFlags.None, AddressOf SendCallback, Me.SocketClient)
            Else
                DisplayMessage("Non connecté au serveur.")
            End If
        End Sub
        Private Sub SendCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim send As Integer = socket.EndSend(asyncResult)
                obj = New String() {"Message envoyé (" + send.ToString() + " bytes envoyés )"}
                'listview.Invoke(dlgDisplay, obj)
            Catch ex As SocketException
                obj = New String() {ex.Message}
                listview.Invoke(dlgDisplay, obj)
            End Try
        End Sub
        Public Sub ReceiveMessage()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
            Else
                DisplayMessage("Non connecté au serveur.")
            End If
        End Sub
        Private Sub ReceiveCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim read As Integer = socket.EndReceive(asyncResult)
                If read > 0 Then
                    obj = New String() {" Réponse : " + Encoding.UTF8.GetString(Me.readbuf)}
                    listview.Invoke(dlgDisplay, obj)
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                End If
                If read = 0 AndAlso Not Me.LocalsocketClientIsShutingDown Then
                    Me.SocketClient.Close()
                    obj = New String() {"Fermeture socket distante"}
                    listview.Invoke(dlgDisplay, obj)
                End If
                Buffer.SetByte(Me.readbuf, 0, 0)
            Catch ex As SocketException
                obj = New String() {ex.Message}
                listview.Invoke(dlgDisplay, obj)
            End Try
        End Sub
 
 
End Class
End Namespace