Files
Pilz/Pilz.IO/ManagedPipes/ManagedPipeServer.vb
2019-12-10 15:13:07 +01:00

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