96 lines
3.2 KiB
VB.net
96 lines
3.2 KiB
VB.net
Imports System.Net
|
|
Imports System.IO.Pipes
|
|
Imports Pilz.Threading
|
|
|
|
Public Class ManagedPipeServer : Inherits ManagedPipe
|
|
|
|
'Pro Verbindung (Anfrage) wird ein Client-Objekt generiert, das den Datenaustausch dieser Verbindung abwickelt
|
|
Public ReadOnly Property Clients As New List(Of ManagedPipeClient)
|
|
Private ReadOnly pipeName As String = ""
|
|
Private ReadOnly maxNumbersOfServerInstances As Integer
|
|
Private numberOfStartedServerInstances As Integer = 0
|
|
|
|
Public Sub New(ByVal pipeName As String)
|
|
Me.New(pipeName, 1)
|
|
End Sub
|
|
|
|
Public Sub New(pipeName As String, maxNumbersOfServerInstances As Integer)
|
|
Me.pipeName = pipeName
|
|
Me.maxNumbersOfServerInstances = maxNumbersOfServerInstances
|
|
CreateWaitingStream()
|
|
End Sub
|
|
|
|
Private Sub CreateWaitingStream()
|
|
If numberOfStartedServerInstances < maxNumbersOfServerInstances Then
|
|
Dim strm = New NamedPipeServerStream(pipeName, PipeDirection.InOut, maxNumbersOfServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)
|
|
numberOfStartedServerInstances += 1
|
|
strm.BeginWaitForConnection(AddressOf EndAccept, strm)
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub EndAccept(ByVal ar As IAsyncResult)
|
|
Dim strm = DirectCast(ar.AsyncState, NamedPipeServerStream)
|
|
|
|
strm.EndWaitForConnection(ar)
|
|
|
|
If IsDisposed Then
|
|
strm.Dispose()
|
|
Return
|
|
End If
|
|
|
|
With New ManagedPipeClient(strm)
|
|
AddHandler .RetriveData, AddressOf Client_RetriveData
|
|
AddHandler .StatusMessage, AddressOf Client_StatusMessage
|
|
AddHandler .Disposed, AddressOf Client_Disposed
|
|
.AddTo(_Clients)
|
|
End With
|
|
|
|
CreateWaitingStream()
|
|
End Sub
|
|
|
|
#Region "_Clients-Ereignisverarbeitung"
|
|
|
|
Private Sub Client_Disposed(ByVal Sender As ManagedPipe)
|
|
'den Client für die beendete Verbindung entfernen
|
|
Sender.RemoveFrom(_Clients)
|
|
numberOfStartedServerInstances -= 1
|
|
CreateWaitingStream()
|
|
End Sub
|
|
|
|
Private Sub Client_RetriveData(ByVal sender As Object, ByVal e As DataEventArgs)
|
|
'einkommende ChatMessages anzeigen, und an alle versenden
|
|
OnRetriveData(e)
|
|
End Sub
|
|
|
|
Private Sub Client_StatusMessage(ByVal sender As Object, ByVal e As DataEventArgs)
|
|
'einkommende StatusMessages durchreichen (zur Anzeige)
|
|
OnStatusMessage(e)
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
Public Overrides Function SendAsnyc(bytes() As Byte) As Task
|
|
Return Task.Run(Sub() Send(bytes))
|
|
End Function
|
|
|
|
Public Overrides Sub Send(data As Byte())
|
|
For Each client As ManagedPipeClient In _Clients 'an alle versenden
|
|
client.Send(data)
|
|
Next
|
|
End Sub
|
|
|
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
|
If numberOfStartedServerInstances < maxNumbersOfServerInstances Then
|
|
Using clnt As New NamedPipeClientStream(pipeName)
|
|
'Herstellen einer Dummi-Verbindung, damit der ServerStream aus dem Wartezustand herauskommt.
|
|
clnt.Connect()
|
|
End Using
|
|
End If
|
|
|
|
For i As Integer = _Clients.Count - 1 To 0 Step -1
|
|
_Clients(i).Dispose()
|
|
Next
|
|
End Sub
|
|
|
|
End Class
|