Projektdateien hinzufügen.
This commit is contained in:
53
Pilz.IO/ManagedPipes/ManagedPipe.vb
Normal file
53
Pilz.IO/ManagedPipes/ManagedPipe.vb
Normal file
@@ -0,0 +1,53 @@
|
||||
''' <summary>
|
||||
''' stellt den Erben "Server" und "Client" 2 verschiedene
|
||||
''' Message-Events zur Verfügung, und ein Event-Raisendes Dispose
|
||||
''' </summary>
|
||||
Public MustInherit Class ManagedPipe : Implements IDisposable
|
||||
|
||||
Public Delegate Sub EventHandlerWithOneArgument(Of T0)(Sender As T0)
|
||||
|
||||
''' <summary>
|
||||
''' Zur Ausgabe chat-verwaltungstechnischer Status-Informationen
|
||||
''' </summary>
|
||||
Public Event StatusMessage As EventHandler(Of DataEventArgs)
|
||||
''' <summary>Zur Ausgabe von Chat-Messages</summary>
|
||||
Public Event RetriveData As EventHandler(Of DataEventArgs)
|
||||
Public Event Disposed As EventHandlerWithOneArgument(Of ManagedPipe)
|
||||
|
||||
Private _IsDisposed As Boolean = False
|
||||
|
||||
Protected MustOverride Sub Dispose(disposing As Boolean)
|
||||
Public MustOverride Sub Send(bytes As Byte())
|
||||
Public MustOverride Function SendAsnyc(bytes As Byte()) As Task
|
||||
|
||||
Protected Sub OnStatusMessage(ByVal e As DataEventArgs)
|
||||
RaiseEvent StatusMessage(Me, e)
|
||||
End Sub
|
||||
|
||||
Protected Sub OnRetriveData(ByVal e As DataEventArgs)
|
||||
RaiseEvent RetriveData(Me, e)
|
||||
End Sub
|
||||
|
||||
Public Sub RemoveFrom(Of T As ManagedPipe)(ByVal Coll As ICollection(Of T))
|
||||
Coll.Remove(DirectCast(Me, T))
|
||||
End Sub
|
||||
|
||||
Public ReadOnly Property IsDisposed() As Boolean
|
||||
Get
|
||||
Return _IsDisposed
|
||||
End Get
|
||||
End Property
|
||||
|
||||
Public Sub AddTo(Of T As ManagedPipe)(ByVal Coll As ICollection(Of T))
|
||||
Coll.Add(Me)
|
||||
End Sub
|
||||
|
||||
Public Sub Dispose() Implements IDisposable.Dispose
|
||||
If _IsDisposed Then Return
|
||||
_IsDisposed = True
|
||||
Dispose(True) ' rufe die erzwungenen Überschreibungen von Sub Dispose(Boolean)
|
||||
RaiseEvent Disposed(Me)
|
||||
GC.SuppressFinalize(Me)
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
91
Pilz.IO/ManagedPipes/ManagedPipeClient.vb
Normal file
91
Pilz.IO/ManagedPipes/ManagedPipeClient.vb
Normal file
@@ -0,0 +1,91 @@
|
||||
Imports System.Net
|
||||
Imports System.Text
|
||||
Imports System.IO.Pipes
|
||||
Imports Pilz.Threading
|
||||
|
||||
Public Class ManagedPipeClient : Inherits ManagedPipe
|
||||
|
||||
Private pipeStream As PipeStream
|
||||
Private _Buf(&H400 - 1) As Byte
|
||||
|
||||
Public Property RaiseEventsGui As Boolean = True
|
||||
|
||||
Public Sub New(pipeName As String)
|
||||
Me.New(pipeName, ".")
|
||||
End Sub
|
||||
|
||||
Public Sub New(pipeName As String, serverName As String)
|
||||
Me.New(pipeName, serverName, -1)
|
||||
End Sub
|
||||
|
||||
Public Sub New(pipeName As String, connectionTimeout As Integer)
|
||||
Me.New(pipeName, ".", connectionTimeout)
|
||||
End Sub
|
||||
|
||||
Public Sub New(pipeName As String, serverName As String, connectionTimeout As Integer)
|
||||
Dim clnt As New NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut, PipeOptions.Asynchronous)
|
||||
clnt.Connect(connectionTimeout)
|
||||
If Not clnt.IsConnected Then
|
||||
Throw New TimeoutException("Connection timeout!")
|
||||
End If
|
||||
SetPipe(clnt)
|
||||
End Sub
|
||||
|
||||
Public Sub New(pipe As PipeStream)
|
||||
SetPipe(pipe)
|
||||
End Sub
|
||||
|
||||
Private Sub SetPipe(pipe As PipeStream)
|
||||
pipeStream = pipe
|
||||
pipeStream.BeginRead(_Buf, 0, _Buf.Length, AddressOf EndRead, Nothing)
|
||||
End Sub
|
||||
|
||||
Private Sub EndRead(ar As IAsyncResult)
|
||||
If IsDisposed Then Return
|
||||
|
||||
Dim bytesCount As Integer = pipeStream.EndRead(ar)
|
||||
If bytesCount = 0 Then 'leere Datenübermittlung signalisiert Verbindungsabbruch
|
||||
If RaiseEventsGui Then
|
||||
CrossThreadsInvokeing.RunGui(AddressOf Dispose)
|
||||
Else
|
||||
Dispose()
|
||||
End If
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim list As New List(Of Byte)
|
||||
|
||||
For i As Integer = 0 To bytesCount - 1
|
||||
list.Add(_Buf(i))
|
||||
Next
|
||||
|
||||
Do While bytesCount = _Buf.Length
|
||||
bytesCount = pipeStream.Read(_Buf, 0, _Buf.Length)
|
||||
For i As Integer = 0 To bytesCount - 1
|
||||
list.Add(_Buf(i))
|
||||
Next
|
||||
Loop
|
||||
|
||||
Dim deargs As New DataEventArgs(list.ToArray)
|
||||
If RaiseEventsGui Then
|
||||
CrossThreadsInvokeing.RunGui(AddressOf OnRetriveData, deargs)
|
||||
Else
|
||||
OnRetriveData(deargs)
|
||||
End If
|
||||
|
||||
pipeStream.BeginRead(_Buf, 0, _Buf.Length, AddressOf EndRead, Nothing)
|
||||
End Sub
|
||||
|
||||
Public Overrides Function SendAsnyc(bytes() As Byte) As Task
|
||||
Return Task.Run(Sub() Send(bytes))
|
||||
End Function
|
||||
|
||||
Public Overrides Sub Send(data As Byte())
|
||||
pipeStream.Write(data, 0, data.Length)
|
||||
End Sub
|
||||
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
pipeStream.Dispose()
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
104
Pilz.IO/ManagedPipes/ManagedPipeServer.vb
Normal file
104
Pilz.IO/ManagedPipes/ManagedPipeServer.vb
Normal file
@@ -0,0 +1,104 @@
|
||||
Imports System.Net
|
||||
Imports System.IO.Pipes
|
||||
Imports Pilz.Threading
|
||||
|
||||
Public Class ManagedPipeServer : Inherits ManagedPipe
|
||||
|
||||
'Pro Verbindung(sanfrage) wird ein Client-Objekt generiert, das den Datenaustausch dieser Verbindung abwickelt
|
||||
Private _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)
|
||||
Console.WriteLine("Start Waiting for new Connection ...")
|
||||
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
|
||||
|
||||
Console.WriteLine("Client accepted!")
|
||||
|
||||
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 '_Clients-Ereignisverarbeitung
|
||||
|
||||
Public Overrides Function SendAsnyc(bytes() As Byte) As Task
|
||||
Return Task.Run(Sub() Send(bytes))
|
||||
End Function
|
||||
|
||||
Public Overrides Sub Send(data As Byte())
|
||||
Console.WriteLine("Sending Data ...")
|
||||
|
||||
'OnRetriveData(New DataEventargs(data)) ' anzeigen
|
||||
|
||||
For Each client As ManagedPipeClient In _Clients ' an alle versenden
|
||||
client.Send(data)
|
||||
Next
|
||||
|
||||
Console.WriteLine("Data send!")
|
||||
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
|
||||
Reference in New Issue
Block a user