vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 26.05.15 21:53

Hallo,
ich möchte zwischen zwei Programmen die auf 2 Rechnern im gleichen Netzwerk laufen Daten austauschen.
Von einem möchte ich Abfragen / Befehle an das andere senden. Das soll dann den Inhalt von Variablen und/oder Datatables zurückschicken.
Bislang habe ich das über Textdatei und Timer gemacht, nun möchte ich das auf NamedPipes umstellen.

Hierüber habe ich jetzt einiges gelesen, mit NamedPipes ein wenig experimentiert.
Dabei habe ich dann gemerkt dass ich auf die Steuerelemente im Formular (Hauptthread) nicht direkt zugreifen kann. Delegate ...

Ist das bei Datatables, Variablen und Propertys auch so?
Ich habe testweise über eine Textbox eine String-Variable gefüllt, auf die konnte ich vom StreamWriter aus nicht zugreifen. Der Objektverweis war Nothing.

Mein angedachter Weg:
auf Prog1 läuft ein NamedPipeServer, auf Prog2 der Client. Mit Prog2 möchte ich Prog1 abfragen / steuern.
Je nach Anfrage soll Prog1 Daten oder Variablen in einen String packen und zurückschicken.
Dann soll in Prog1 dieser String ausgewertet werden und ein DGV oder Labels gefüllt oder eine Meldung angezeigt werden.

Das wird in der derzeitig implementierten Lösung über Textbox über eine Property gemacht.
Kann ich die auch direkt über die NamedPipe füllen, oder gibt es auch dafür Delegaten?

Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Blackbox
Datum: 26.05.15 22:12

Hallo,

Stichwort: Marshalling? Nichts gefunden?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 27.05.15 06:13

Hallo!

Was genau Du vorhast, ist nicht klar. Kommunikation zwischen Threads, Programmen, Rechnern ...?

Im Prinzip sollte die Interprozess-Kommunikation durch binär-Serialisierbare Klassen
zu erledigen sein. Hier ein simples Beispiel für die Übertragung einer Datatable
zwischen zwei Threads per NamedPipes.

Zugriffe auf Controls von ausserhalb des UI-Thread erfordern ein Invoke (Delegat).

Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO.Pipes
Imports System.Threading
Imports System.ComponentModel
 
 
Public Class frmPipe
 
    Dim dgv As New DataGridView With {.Parent = Me}
    Delegate Sub Tabledelegate(ByVal dt As DataTable)
 
 
    Private Sub frmPipe_Load(sender As System.Object, _
                e As System.EventArgs) Handles MyBase.Load
 
        'NamedPipe-Threads starten
 
        Dim st As New Thread(AddressOf serverthread)
        st.Start()
 
        Dim ct As New Thread(AddressOf clientthread)
        ct.Start()
 
    End Sub
 
 
 
    Private Sub serverthread()
 
        'Testdaten erstellen 
        Dim dt As New DataTable
        With dt
            .Columns.Add("SP1")
            .Columns.Add("SP2")
            .Columns.Add("SP3")
            .Rows.Add("11", "12", "13")
            .Rows.Add("21", "22", "23")
            .Rows.Add("31", "32", "33")
        End With
 
        'Übertragung der Datatable
 
        'Serialisierung der Datatable in einen Memorystream
        Dim bf As New BinaryFormatter
        Dim ms As New IO.MemoryStream
        bf.Serialize(ms, dt)
        Dim bl As Integer = ms.ToArray.Length 'Byte-Länge notieren
 
        'zu sendende Bytelänge in Bytearray wandeln
        Dim blb As Byte() = BitConverter.GetBytes(bl)
 
        'NamedPipe für das Senden der Tabelle erstellen
        Dim server As New NamedPipeServerStream("PipeTable")
        server.WaitForConnection()
 
        'Byte-Arrays übertragen (senden)
        server.Write(blb, 0, blb.Length) 'Länge 
        server.Write(ms.ToArray, 0, bl)  'Datatable-Serialisierung
 
    End Sub
 
 
    Private Sub clientthread()
 
        'NamedPipe für den Datenempfang
        Dim client As New NamedPipeClientStream("PipeTable")
        client.Connect()
 
        'Byte-Länge lesen 
        Dim blb(4) As Byte
        client.Read(blb, 0, 4)
        Dim bl As Integer = BitConverter.ToInt32(blb, 0)
 
        'Array für die empfangenen Daten 
        Dim buffer(bl) As Byte
 
        client.Read(buffer, 0, bl) 'Datatable-Serialisierung lesen
 
        'Deserialisieren des Byte-Array
        Dim msc As New IO.MemoryStream(buffer)
        Dim bfc As New BinaryFormatter
        Dim dtc As DataTable = _
           CType(bfc.Deserialize(msc, Nothing), DataTable)
 
        'Anzeige der erhaltenen Datatable-Daten im Grid 
        Me.Invoke(New Tabledelegate(AddressOf showtable), dtc)
    End Sub
 
 
 
    Private Sub showtable(ByVal dt As DataTable)
        dgv.DataSource = Nothing
        dgv.DataSource = dt
    End Sub
 
End Class


Beitrag wurde zuletzt am 27.05.15 um 06:21:47 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Ergänzender Hinweis 
Autor: Manfred X
Datum: 27.05.15 08:21

Falls alle zu übertragenden Datenfelder in einer serialisierbaren
Datenklasse zusammengefaßt werden, kann man eine Instanz dieser Klasse
direkt in den PipeStream Serialisieren (Senden) bzw. aus ihm Deserialisieren (Empfangen).
Das Zusammenbauen eines Byte-Array aus den einzelnen Elementen entfällt.




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 27.05.15 10:27

Danke,
das Beispiel trifft meine Anforderung ziemlich genau.

Wie kann ich beim empfangenen Stream erkennen was da kommt? Ob jetzt nur der Inhalt einer Variablen (String, ggf. über mehrere Zeilen) oder eine verpackte DataTable?
Je nachdem wäre eine andere Prozedur zu starten.

Bislang hatte ich die DataTable in einen String gepackt uns später wieder zusammengebastelt, so ist es aber viel besser.

Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 27.05.15 13:37

Du könntest eine serialisierbare Klasse erstellen,
die alle insgesamt benötigten Member/Properties enthält (Strings, Datatables usw.)
und zusätzlich eine Kennung (Enumeration) einfügen, aus der hervorgeht,
welche Art von Inhalt (= Welche der Properties der Klasse) bei der aktuell
übergebenen Instanz relevant ist ( = Daten enthalten).

Auf diese Weise kannst Du alle Austauschvorgänge mit einer
Pipe und je einer Routine in der Client-/Server-Anwendung regeln.
Auch die Programm-Wartung ist wegen der gemeinsamen "Transfer-Klasse"
relativ einfach.

Einfache Tranferklasse:
    Public Enum TransferTyp
        [String]
        Number
        Table
    End Enum
 
    <Serializable()> _
    Public Class TransferDaten
 
        Public Property Typ As TransferTyp 'Kennung
 
        Public Property AString As String  'Properties für diverse Übergaben
        Public Property BNumber As Decimal
        Public Property CTable As DataTable
 
    End Class
Pipe-Routinen:
    Private Sub server_thread()
 
        'Testdaten erstellen 
 
        Dim dt As New DataTable
        With dt
            .Columns.Add("SP1")
            .Columns.Add("SP2")
            .Columns.Add("SP3")
            .Rows.Add("11", "12", "13")
            .Rows.Add("21", "22", "23")
            .Rows.Add("31", "32", "33")
        End With
 
        Dim tc As New TransferDaten
        'Transferklasse füllen
        tc.CTable = dt
        tc.Typ = TransferTyp.Table
 
        'Direkte Serialisierung der Datatable in der 
        'Transferklasse in die Pipe
        Dim bf As New BinaryFormatter
        Dim server As New NamedPipeServerStream("PipeTransfer")
        server.WaitForConnection()
        bf.Serialize(server, tc)
        server.Close()
 
    End Sub
 
 
 
    Private Sub Client_Thread()
 
        'NamedPipe für den Datenempfang
        Dim client As New NamedPipeClientStream("PipeTransfer")
        client.Connect()
 
        'Direkte Deserialisierung der empfangenen TC-Instanz
        Dim bfc As New BinaryFormatter
        Dim tc As TransferDaten = CType(bfc.Deserialize(client), TransferDaten)
        client.Close()
 
        'Hier Fallunterscheidung gemäß Übergabetyp vornehmen
        If tc.Typ = TransferTyp.Table Then
            'Anzeige der erhaltenen Datatable-Daten im Grid 
            Me.Invoke(New Tabledelegate(AddressOf showtable), tc.CTable)
        else
           '..... 
        End If
 
    End Sub


Beitrag wurde zuletzt am 27.05.15 um 13:41:30 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 27.05.15 14:30

Danke
Sieht super aus.
Werde es heute Abend einbauen.
Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 06.06.15 22:03

So, habe es eingebaut.
Laufe beim Client in nen Fehler beim Datenempfang.
SerializationException wurde nicht behandelt
Die Assembly "TestServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht gefunden werden.
Derzeit bin ich noch mit beiden Programmen auf dem gleichen Rechner. Habe allerdings beim Client für den PipeNamen anstatt dem führenden "." den Rechnernamen eingesetzt. Das dürfte es aber doch nicht ausmachen.
Bin grade ratlos.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Kuno60
Datum: 07.06.15 01:28

Hallo,

binär serialisierte Daten können nur in die gleiche Assembly wieder geladen werden.
Der Assemblyname, Typen und Namespacebereiche, müssen überein stimmen.
Das gilt auch für die Serialisierung über ein Netzwerk.

Also wenn du für den Server und für den Client verschiedene Programme verwendest, solltest du die Netzwerkübertragung mit der Serialisierung, in einer Klassenbibliothek (DLL) unterbringen und diese in beiden Programmen verwenden (Verweis hinzufügen).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 07.06.15 09:10

Danke für die Info.
Ich habe mich noch nihct mit dem Erstellen von Anwendungserweiterungen befasst. Dann werde ich mir das anschauen.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 07.06.15 14:57

irgendwo hab ich was falsch gemacht.
Ich bekomme noch immer den gleichen Fehler:
SerializationException wurde nicht behandelt
Die Assembly "TestServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht gefunden werden.


Die gesamte Pipe samt TransferDaten habe ich in eine dll ausgelagert. Diese binde ich in beide Projekte ein.

Die Sub für den Server sieht so aus:
  <System.Runtime.InteropServices.ComVisible(True)> _
 Public Sub Serverstart()
        Using PipeServer As New  _
          NamedPipeServerStream(PipeName, PipeDirection.InOut, _
          maxNumberOfServerinstances, PipeTransmissionMode.Message, _
          PipeOptions.Asynchronous)
 
            ZeileAnzeigen("Server: --> warte auf Client..." & " PipeName = " _
              & PipeName)
            PipeServer.WaitForConnection()
            ZeileAnzeigen("Server: --> verbunden")
            PipeOn = True
            While PipeOn
                Try
                    If Not PipeServer.IsConnected Then Serverstart()
                    Using sr As New StreamReader(PipeServer), sw As New _
                      StreamWriter(PipeServer)
                        sw.AutoFlush = True
                        Dim temp As String = String.Empty
                        tcOut = Nothing
                        While (assign(temp, sr.ReadLine())) IsNot Nothing
                            ServerInput = temp
                            If ServerInput.Length > 0 Then RaiseEvent _
                              PropertyChanged(Me, ServerRequest)
                            If Not tcOut Is Nothing Then
                                Dim bf As New BinaryFormatter
                                bf.Serialize(PipeServer, tcOut)
                            End If
                        End While
                        ZeileAnzeigen("Server: --> Daten")
                    End Using
                    'End If
                Catch ex As Exception
                    ' kam Fehler bei beenden Client vor Server --> 
                    ' unterbrochene Pipe
                    ZeileAnzeigen("Server Fehler: --> " & _
                      ex.InnerException.ToString)
                End Try
            End While
            ZeileAnzeigen("Server: --> beende")
        End Using
        PipeOn = False
    End Sub
und für den Client:
  <System.Runtime.InteropServices.ComVisible(True)> _
 Public Sub ClientStart(ByVal AnfrageString As String)
        Using PipeClient As New NamedPipeClientStream(ServerName, PipeName, _
          PipeDirection.InOut, PipeOptions.None, _
          Security.Principal.TokenImpersonationLevel.Impersonation)
            ZeileAnzeigen("Client: --> warte auf Server..." & "PipeName = " _
            & String.Concat(ServerName, ",", PipeName))
            PipeClient.Connect()
            startTimer()
            PipeOn = True
            ZeileAnzeigen("Client: --> verbunden")
            sw = New StreamWriter(PipeClient)
            sw.AutoFlush = True
            sw.WriteLine(AnfrageString)
            ZeileAnzeigen("Client Anfrage: --> " & AnfrageString)
            If Not PipeOn Then PipeClient.Close()
            'Direkte Deserialisierung der empfangenen TC-Instanz
            Dim bfc As New BinaryFormatter
            Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient), _
              TransferDaten)
            If Not tc Is Nothing Then ClientInput = tc : RaiseEvent _
            PropertyChanged(Me, ClientRequest) : TimeOut.Dispose()
            PipeClient.Close()
            ZeileAnzeigen("Client: --> beendet")
        End Using
    End Sub
zum Fehler kommt es in der Zeile:
Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient),TransferDaten)

Die Transferdaten werden in der dll zusammengestellt:
    Private tcOut As TransferDaten
    Public TransferTyp As TransferTyp
    Public TransferDataTable As DataTable
    Public TransferString As String
    Public TransferNumber As Decimal
    Public TransferCount As Integer
    Public Sub createTransferdata()
        Try
            tcOut = New TransferDaten
            With tcOut
                .Typ = TransferTyp
                If Not String.IsNullOrEmpty(TransferString) Then .TString = _
                  TransferString
                Select Case TransferTyp
                    Case NamedPipe.TransferTyp.Count
                        .TCount = TransferCount
                    Case NamedPipe.TransferTyp.Table
                        .CTable = TransferDataTable
                    Case NamedPipe.TransferTyp.Decimal
                        .TNumber = TransferNumber
                End Select
            End With
        Catch ex As Exception
            tcOut = Nothing
        End Try
    End Sub

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 07.06.15 15:24

Vermutlich fehlt der korrekte Projekt-Verweis auf die Bibliothek,
die die Tranferklasse enthält.
Heißt diese Bibliothek tatsächlich "Testserver"????

Nur der Code der Transferklasse gehört zwingend in die DLL
(siehe mein Beispiel).
Du hast anscheinend keine entsprechende Klasse erstellt.
Vermutlich so oder ähnlich ...
<Serializable> _
Public Class tcOut As TransferDaten
    Public TransferTyp As TransferTyp
    Public TransferDataTable As DataTable
    Public TransferString As String
    Public TransferNumber As Decimal
    Public TransferCount As Integer
End Class
Die Pipe, die Instanzen der Transferklasse und die
(De-)Serialisierungsmethoden sind vermutlich jeweils
spezifisch in den Anwendungsprogrammen zu erstellen.

Beitrag wurde zuletzt am 07.06.15 um 15:34:51 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 07.06.15 15:53

hm, in der dll habe ich unter anderem diese Klasse:
Public Enum TransferTyp
    [String]
    Count
    [Decimal]
    Table
End Enum
 
<Serializable()> _
Public Class TransferDaten
 
    Dim _Typ As TransferTyp
    Public Property Typ() As TransferTyp 'Kennung
        Get
            Return _Typ
        End Get
        Set(ByVal value As TransferTyp)
            _Typ = value
        End Set
    End Property
 
    Dim _String As String
    Public Property TString() As String  'Properties für diverse Übergaben
        Get
            Return _String
        End Get
        Set(ByVal value As String)
            _String = value
        End Set
    End Property
 
    Dim _Number As Decimal
    Public Property TNumber() As Decimal
        Get
            Return _Number
        End Get
        Set(ByVal value As Decimal)
            _Number = value
        End Set
    End Property
 
    Dim _Count As Integer
    Public Property TCount() As Integer
        Get
            Return _Count
        End Get
        Set(ByVal value As Integer)
            _Count = value
        End Set
    End Property
 
    Dim _DTable As DataTable
    Public Property CTable() As DataTable
        Get
            Return _DTable
        End Get
        Set(ByVal value As DataTable)
            _DTable = value
        End Set
    End Property
 
End Class
und der Transfer wird mit dem oben gepostetem Code erstellt.

Testserver ist der Name der Anwendung, die den Server einbindet.

in der dll habe ich:
Klasse für die Pipe (Pipe.vb)
Klasse für den Transfer (TransferDaten.vb
Form zur Auswahl des Serverrechners für den Client
Modul für allgemeine Berechnungen

in den beiden Projekten wo ich die dll einbinde habe ich den Verweis gesetzt und die "alten" Klassen für Pipes und Transfer auf Buildvorgang = keine gesetzt. Die dürten eigentlich nicht mehr reinpfuschen.


Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 07.06.15 18:37

Hallo!

Schreibe im Code bei den Variablen-Deklaration nich nur "As TransferDaten",
sondern verwende die volle Qualifikation (Bibliothek, Namespace, Klasse).

Entferne veraltete Klassen aus dem Projekt oder kommentiere deren Klassencode
vor dem Kompilieren aus.










Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 07.06.15 19:46

ich konnte es ein wenig eingrenzen.
Bei Transferdata.Typ = String klappt es, bei DataTable kommt der Fehler.

Kann das was mit dem Typisierten Dataset zu tun haben, das ich beim Programm mit dem Server habe?

habe die createTransferdata nun abgeändert, aber ohne Erfolg:
Public Sub createTransferdata()
        'Try
        tcOut = New NamedPipe.TransferDaten
        With tcOut
            .Typ = NamedPipe.TransferTyp
            If Not String.IsNullOrEmpty(TransferString) Then .TString = _
              TransferString
            Select Case .Typ
                Case NamedPipe.TransferTyp.Count
                    .TCount = TransferCount
                Case NamedPipe.TransferTyp.Table
                    .CTable = Nothing
                    .CTable = New DataTable
                    .CTable = TransferDataTable.Copy
                Case NamedPipe.TransferTyp.Decimal
                    .TNumber = TransferNumber
            End Select
        End With
        'Catch ex As Exception
        'tcOut = Nothing
        'End Try
    End Sub

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 07.06.15 22:19

Verwende für die Binär-Serialisierung der Tabelle eine Basis-Datatable,
keine typisierte Ableitung.

Die Datatable.Copy-Methode erstellt bei Anwendung auf eine
abgeleitete Datatable wiederum eine abgeleitete Datatable.
https://msdn.microsoft.com/en-us/library/system.data.datatable.copy%28v=vs.110%29.aspx




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 08.06.15 07:39

ja, das typisierte war es.
Ich habe meiner Dll nun noch eine Funktion hinzugefügt die mir die Transfertabelle umkopiert, jetzt klappt es
Public Function DataTableCopy(ByVal Dt As DataTable) As DataTable
        Dim DtN As New DataTable
        For Each C As DataColumn In Dt.Columns
            DtN.Columns.Add(C.ColumnName, C.DataType)
        Next
        For Each r As DataRow In Dt.Rows
            Dim nr As DataRow = DtN.NewRow
            For c As Integer = 0 To r.Table.Columns.Count - 1
                If Not r(c) Is DBNull.Value Then nr(c) = r(c)
            Next
            DtN.Rows.Add(nr)
        Next
        Return DtN
    End Function
nun noch geändert:
.CTable = DataTableCopy(TransferDataTable)
Da ich das nun als dll habe, kann ich das auch in meine anderen Programme einbauen.
Hat sich der Aufwand wenigstens gelohnt

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Tommi467
Datum: 12.06.15 08:43

So etwas bräuchte ich auch gerade
Gibt es nicht eine fertige DLL und ein Demo wie sie aufzurufen ist zur freien Verwendung???

Ich hab noch nie mit DLLs gearbeitet und kenne mich damit wirklich 0 aus.
Das Teil selbst zu erstellen und einzubinden traue ich mir einfach nicht zu .
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 12.06.15 09:18

fertige dll habe ich noch keine gefunden. Einige Beispiele, auf MS und auch hier im Forum schon.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 12.06.15 10:57

1. Erstelle ein neues Projekt des Typs Klassenbibliothek.
2. In diesem Projekt codierst Du eine öffentliche Klasse,
die die Properties enthält, über die Du Daten austauschen möchtest.
3. Erstelle das Projekt (DLL)

In den Anwendungsprogrammen, die per Pipe Daten austauschen sollen,
setzt Du jeweils einen Projektverweis: Reiter "Durchsuchen" -- zu Deiner
DLL navigieren und sie bestätigen.

In den Projekten findest Du bei Eingabe von "Imports" am Anfang
einer CodeDatei den Namen Deiner Bibliothek per Intellisense.
Importiere sie und Du kannst Instanzen der dort enthaltenenen Klasse
wie gewöhnlich deklarieren und nutzen.









Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 12.06.15 22:19

So, nun habe ich die 2 Programmteile auf unterschiedlichen Rechnern laufen.
Aber, ich bekomme keine Verbindung vom Client zum Server.

Mein Aufruf im Clientprog sieht so aus:
Private Sub PipeClientStart(ByVal AnfrageString As String)
        If ps Is Nothing Then
            ps = New NamedPipe.Pipe
            RemoveHandler ps.PropertyChanged, AddressOf ServerAnswer
            AddHandler ps.PropertyChanged, AddressOf ServerAnswer
            RemoveHandler ps.PropertyChanged, AddressOf ClientTimeOut
            AddHandler ps.PropertyChanged, AddressOf ClientTimeOut
        End If
 
        With ps
            If String.IsNullOrEmpty(PipeServerName) Then PipeServerName = _
              .ServerName Else .ServerName = PipeServerName
            .PipeName = "MyPipeName"
            .ClientStart(AnfrageString)
        End With
    End Sub
und in der Klasse der Pipe:
 Private _PName As String = "Testpipe"
    Public Property PipeName() As String
        Get
            Return _PName
        End Get
        Set(ByVal value As String)
            _PName = value
        End Set
    End Property
 
    Private _ServerName As String = String.Empty
    Public Property ServerName() As String
        Get
            If _ServerName = String.Empty Then
                Using Pcs As New dlgServerName
                    Pcs.ShowDialog()
                    If Pcs.DialogResult = Windows.Forms.DialogResult.OK Then _
                      _ServerName = If(Pcs.PcName.Trim = String.Concat("\\", _
                      My.Computer.Name.Trim), ".", Pcs.PcName)
                End Using
            End If
            Return _ServerName
        End Get
        Set(ByVal value As String)
            If value = String.Concat("\\", My.Computer.Name.Trim) Then _
              _ServerName = "." Else _ServerName = value
        End Set
    End Property
 
 <System.Runtime.InteropServices.ComVisible(True)> _
 Public Sub ClientStart(ByVal AnfrageString As String)
        Using PipeClient As New NamedPipeClientStream(ServerName, PipeName, _
          PipeDirection.InOut, PipeOptions.None, _
          Security.Principal.TokenImpersonationLevel.Impersonation)
            ZeileAnzeigen("Client: --> warte auf Server..." & "PipeName = " _
            & String.Concat(ServerName, ",", PipeName))
            PipeClient.Connect()
            startTimer()
            PipeOn = True
            ZeileAnzeigen("Client: --> verbunden")
            sw = New StreamWriter(PipeClient)
            sw.AutoFlush = True
            sw.WriteLine(AnfrageString)
            ZeileAnzeigen("Client Anfrage: --> " & AnfrageString)
            If Not PipeOn Then PipeClient.Close()
            'Direkte Deserialisierung der empfangenen TC-Instanz
            ' Try
            Dim bfc As New BinaryFormatter
            Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient), _
              NamedPipe.TransferDaten)
            If Not tc Is Nothing Then ClientInput = tc : RaiseEvent _
            PropertyChanged(Me, ClientRequest) : TimeOut.Dispose()
            ' Catch ex As Exception
            'ZeileAnzeigen("Client Fehler: --> " & If(ex Is Nothing, "", 
            ' ex.InnerException.ToString))
            'TimeOut.Dispose()
            'End Try
            PipeClient.Close()
            ZeileAnzeigen("Client: --> beendet")
        End Using
    End Sub
das ZeileAnzeigen brachte mir:
Client: --> warte auf Server...PipeName = \\MICHAEL-PC,MyPipeName

Die beiden Rechner sind im gleichen Netzwerk und ich habe über den Explorer auch Zugriff auf den anderen. Habe ich bei der Angabe des Servernamens was falsch?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 14.06.15 14:23

Brauche ich auf dem Serverrechner ein Benutzerkonto für den Anwender des Clientstreams?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 24.06.15 21:08

könnt Ihr mir hier bitte noch weiterhelfen, ich packs nicht alleine.
Auf dem gleichen Rechner klappts, auf verschiedenen nicht.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 24.06.15 21:16

Laut Dokumentation sollte es so funktionieren:
[I]If the client and server processes were on separate computers,
"." would be replaced with the network name of the computer
that runs the server process.[/I]

Wie sieht es denn mit den Zugriffsrechten aus?

Beitrag wurde zuletzt am 24.06.15 um 21:19:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Bazi
Datum: 25.06.15 20:11

über die Zugriffsrechte habe ich mir bislang keine Gedanken gemacht.
Brauche ich da welche?
Beide Programme laufen ohne Administratorrechte, also nur mit den jeweiligen Benutzerrechten.

Den "." im Aufruf habe ich durch den Server-Rechnernamen ersetzt.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datenaustausch - NamedPipes - Multithreading - Datatable 
Autor: Manfred X
Datum: 25.06.15 20:14

Wenn bei Server/Client unterschiedliche Benutzer angemeldet sind,
kann das Probleme mit den Zugriffsrechten geben (habe ich gelesen!).
Teste man was geschieht, wenn der User identisch ist.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel