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 :
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
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
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
Partager