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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
|
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.ServiceModel
Imports System.Threading
Imports ChatContracts
Namespace ChatServices
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerSession, ConcurrencyMode:=ConcurrencyMode.Single)> Public Class ChatWCF
Implements IChatWCF
Shared Event ChatMessageEvent As ChatMessageEventHandler
Delegate Sub ChatMessageEventHandler(ByVal sender As Object, ByVal e As ChatMessageEventArgs)
Shared Event ConnexionEvent As ConnexionEventHandler
Delegate Sub ConnexionEventHandler(ByVal sender As Object, ByVal e As ConnexionEventArgs)
Shared Event DeconnexionEvent As DeconnexionEventHandler
Delegate Sub DeconnexionEventHandler(ByVal sender As Object, ByVal e As DeconnexionEventArgs)
Event getListUserEvent As getListUserEventHandler ' not shared so only the caller gets it
Delegate Sub getListUserEventHandler(ByVal sender As Object, ByVal e As getListUserEventArgs)
'pour rappeler le client
Private callback As IChatWCFRappel = Nothing
'pseudo de l'utilisateur
Private pseudoUtilisateur As String = Nothing
'liste des utilisateurs connectés
Shared listeUtilisateurs As List(Of String) = New List(Of String)
Public Sub getlisteUtilisateur() Implements IChatWCF.GetlisteUtilisateurs
Dim str As String = ""
For i As Integer = 0 To listeUtilisateurs.Count - 1
str &= listeUtilisateurs(i) & ";"
Next
Dim gea As getListUserEventArgs = New getListUserEventArgs()
gea.UserList = str
gea.Utilisateur = Me.pseudoUtilisateur '//l'expéditeur
RaiseEvent getListUserEvent(Me, gea)
Console.WriteLine(gea.Utilisateur & ":" & gea.UserList)
End Sub
Public Sub DemarrerSession(ByVal pseudo As String) Implements IChatWCF.DemarrerSession
Console.WriteLine("User " & pseudo & " is attempting to connect")
callback = OperationContext.Current.GetCallbackChannel(Of IChatWCFRappel)()
pseudoUtilisateur = pseudo
SyncLock (listeUtilisateurs)
listeUtilisateurs.Add(pseudo)
AddHandler ChatMessageEvent, AddressOf ChatMessageHandler 'on s'abonne à la réception de nouveaux messages
AddHandler ConnexionEvent, AddressOf ConnexionHandler 'on s'abonne à la connexion de nouveaux utilisateurs
AddHandler DeconnexionEvent, AddressOf DeconnexionHandler 'on s'abonne à la déconnexion d'utilisateurs
AddHandler getListUserEvent, AddressOf getListUserHandler
Dim cea As ConnexionEventArgs = New ConnexionEventArgs() 'on informe les utilisateurs de la connexion d'un nouveau venu
cea.Utilisateur = Me.pseudoUtilisateur
RaiseEvent ConnexionEvent(Me, cea)
AddHandler OperationContext.Current.Channel.Closing, AddressOf Channel_Closing
Console.WriteLine("User {0} is connected", pseudoUtilisateur)
End SyncLock
End Sub
'//le client ferme le canal
Private Sub Channel_Closing(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("{0} closed channel", pseudoUtilisateur)
' //si on n'est pas passé par FermerSession avant
SyncLock (listeUtilisateurs)
If listeUtilisateurs.Contains(Me.pseudoUtilisateur) Then
FermerSession()
End If
End SyncLock
End Sub
Public Sub FermerSession() Implements IChatWCF.FermerSession
SyncLock (listeUtilisateurs)
' //on désabonne le client
RemoveHandler ChatMessageEvent, AddressOf ChatMessageHandler
RemoveHandler ConnexionEvent, AddressOf ConnexionHandler
RemoveHandler DeconnexionEvent, AddressOf DeconnexionHandler
RemoveHandler getListUserEvent, AddressOf getListUserHandler
listeUtilisateurs.Remove(Me.pseudoUtilisateur)
End SyncLock
' //on informe les utilisateurs de la déconnexion
Dim dea As DeconnexionEventArgs = New DeconnexionEventArgs()
dea.Utilisateur = Me.pseudoUtilisateur
Try
RaiseEvent DeconnexionEvent(Me, dea)
Catch ex As Exception
End Try
Console.WriteLine("User {0} is disconnected", Me.pseudoUtilisateur)
End Sub
Public Sub EnvoyerMessage(ByVal message As String) Implements IChatWCF.EnvoyerMessage
'on informe les utilisateurs d'un nouveau message
Dim mea As ChatMessageEventArgs = New ChatMessageEventArgs()
mea.Message = message '//le message
mea.Utilisateur = Me.pseudoUtilisateur '//l'expéditeur
RaiseEvent ChatMessageEvent(Me, mea)
Console.WriteLine(mea.Utilisateur & ":" & mea.Message)
End Sub
Public Sub Test() Implements IChatWCF.test
Console.WriteLine("Test")
End Sub
'méthode appelée quand l'évènement ChatMessageEvent est déclanché
Private Sub ChatMessageHandler(ByVal sender As Object, ByVal e As ChatMessageEventArgs) ' Handles Me.ChatMessageEvent
callback.ReceptionMessage(e.Utilisateur, e.Message)
End Sub
'méthode appelée quand l'évènement DeconnexionEvent est déclanché
Private Sub DeconnexionHandler(ByVal sender As Object, ByVal e As DeconnexionEventArgs) ' Handles Me.DeconnexionEvent
callback.deconnexionUtilisateur(e.Utilisateur)
End Sub
'méthode appelée quand l'évènement ConnexionEvent est déclanché
Private Sub ConnexionHandler(ByVal sender As Object, ByVal e As ConnexionEventArgs) ' Handles Me.ConnexionEvent
callback.connexionUtilisateur(e.Utilisateur)
End Sub
Private Sub getListUserHandler(ByVal sender As Object, ByVal e As getListUserEventArgs)
callback.ReceptionUserList(e.Utilisateur, e.UserList)
End Sub
Class ChatMessageEventArgs
Inherits EventArgs
Private _message As String
Private _utilisateur As String
Public Property Message() As String
Get
Return _message
End Get
Set(ByVal Value As String)
_message = Value
End Set
End Property
Public Property Utilisateur() As String
Get
Return _utilisateur
End Get
Set(ByVal Value As String)
_utilisateur = Value
End Set
End Property
End Class
Class DeconnexionEventArgs
Inherits EventArgs
Private _utilisateur As String
Public Property Utilisateur() As String
Get
Return _utilisateur
End Get
Set(ByVal Value As String)
_utilisateur = Value
End Set
End Property
End Class
Class ConnexionEventArgs
Inherits EventArgs
Private _utilisateur As String
Public Property Utilisateur() As String
Get
Return _utilisateur
End Get
Set(ByVal Value As String)
_utilisateur = Value
End Set
End Property
End Class
Class getListUserEventArgs
Inherits EventArgs
Private _utilisateur As String
Private _userlist As String
Public Property Utilisateur() As String
Get
Return _utilisateur
End Get
Set(ByVal Value As String)
_utilisateur = Value
End Set
End Property
Public Property UserList() As String
Get
Return _userlist
End Get
Set(ByVal Value As String)
_userlist = Value
End Set
End Property
End Class
End Class
End Namespace |