vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 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 - Fortgeschrittene
wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 21.09.11 13:58

Hallo zusammen,

ich habe da mal etwas für die Experten unter euch.
Ich meine mal gelesen zu haben, das sowas geht, finde es aber nicht mehr wieder.

Ich habe ein Programm "Test1" geschieben, das auf dem Rechner "A" läuft.
Die Software führt in gewissen Abständen diverse aufwendige Abfagen über den Netzwerkzustand durch und zeigt diese Zustände in Statusanzeigen an.

Auf einem zweiten Rechner "B" soll nun ebenfalls eine Statusanzeige erfolgen, ohne das aber
die gesamten Funktionen erneut ablaufen. Kann ich mit Programm "Test2" auf einem anderen PC auf die Objecte/Objekteigenschaften im Programm "Test1" zugreifen?

Wenn nein, wie kann ich eine Datenanzeige realisieren, ohne Zugriffsprobleme zu bekommen?

Ich habe schon bei verschiedenen anderen Projekten immer das Problem gehabt, das es bei Übergaben via Datei zu Zugriffsproblemen kam, wenn das eine System zugreifen wollte, während das andere noch am schreiben war und umgekehrt. Zudem habe ich das Problem, das unsere Server (2008 R2) scheinbar ebenfalls immer sehr lange benötigt um Dateien wieder frei zu geben.

Schon mal vielen Dank für eure Hilfe
Gruß Thomas
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 14:51

Natürlich kann man übers Netzwerk eine Abfrage schicken und Ergebnis bekommen, mittels TCP, UDP, WebService, Remoting, Named Pipe usw. Wenn man das programmiert hat. Eine Datei hat immer das schon erwähnte Problem, dass Zugriffe irgendwie synchronisiert werden müssen. Es sei denn du machst das mit mehr als einer Datei, zB eine wird geschrieben und am Ende unbenannt mit einer Numerierung. Eine zweite wird gelesen, immer die mit der höchsten Nummer. Alte Dateien werden vom "Server" gelöscht.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 21.09.11 14:57

Hallo DaveS,

danke für deine erneut schnelle Hilfe.
Nein, auf die Idee mit dem Umbenennen von Dateien bin ich auch schon gekommen.
Gibt aber auch Probleme, weil der Server so lange die Pfoten drauf hat, bevor die Daten umbenannt und wieder freigegeben werden.

Deshalb suche ich ja nach einer anderen Lösung.

Kannst du mir zum Thema TCP, UDP, WebService, Remoting, Named Pipe irgendwelche Beipiele aufzeigen, wo ich mich einlesen kann. Ich hab keinen blassen Dunst unter welchem Schlagwort ich da suchen soll, bin schon froh das ich den Thread halbwegs benannt bekommen habe...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 15:57

Dieser Code basiert auf dem Beispiel von http://www.dijksterhuis.org/using-named-pipes-in-c-windows/.

Der Server protokolliert Eingabe von Benutzerkonsole. Wenn der Benutzer den Befehl "time" eintippt antwortet der Server zusätzlich mit Datum/Uhrzeit (am Server!)

Das läuft in einem Prozess zwischen zwei Threads, ein Named Pipe kann man aber auch interprozess oder zwischen Rechnern im Netz benutzen (Name = \\ServerName\PipeName).

Imports System.IO
Imports System.IO.Pipes
Imports System.Threading
 
Public Class TestPipe
 
    Public Sub ThreadStartServer()
        ' Create a name pipe
        Using pipeStream As New NamedPipeServerStream("mytestpipe")
            Console.WriteLine("[Server] Pipe created {0}", _
              pipeStream.GetHashCode())
 
            ' Wait for a connection
            pipeStream.WaitForConnection()
            Console.WriteLine("[Server] Pipe connection established")
 
            Using sr As New StreamReader(pipeStream),
                sw As New StreamWriter(pipeStream)
                sw.AutoFlush = True
                Dim temp As String = String.Empty
                ' We read a line from the pipe and print it together with the 
                ' current time
                While (assign(temp, sr.ReadLine())) IsNot Nothing
                    Dim dt As DateTime = DateTime.Now
                    Console.WriteLine("[Server] {0}: {1}", dt, temp)
                    If temp = "time" Then
                        sw.WriteLine(dt.ToString())
                    End If
                End While
            End Using
        End Using
 
        Console.WriteLine("[Server] Connection lost")
    End Sub
 
    Public Sub ThreadStartClient(obj As Object)
 
        Using pipeStream As New NamedPipeClientStream("mytestpipe")
            ' The connect function will indefinately wait for the pipe to 
            ' become available
            ' If that is not acceptable specify a maximum waiting time (in ms)
            pipeStream.Connect()
 
            Console.WriteLine("[Client] Pipe connection established")
            Using sw As New StreamWriter(pipeStream),
                sr As New StreamReader(pipeStream)
                sw.AutoFlush = True
                Dim temp As String = String.Empty
                Console.WriteLine("[Client] Please type a message and press" & _
                  "[Enter], or type 'quit' to exit the program")
                While (assign(temp, Console.ReadLine())) IsNot Nothing
                    If temp = "quit" Then
                        Exit While
                    End If
                    sw.WriteLine(temp)
                    If temp = "time" Then
                        Dim response As String = sr.ReadLine()
                        Console.WriteLine("[Response] time=" & response)
                    End If
                End While
            End Using
        End Using
    End Sub
 
    Private Sub TestPipe()
 
        Dim ServerThread As New Thread(AddressOf ThreadStartServer)
        Dim ClientThread As New Thread(AddressOf ThreadStartClient)
 
        ServerThread.Start()
        ClientThread.Start()
 
    End Sub
 
    Private Shared Function assign(Of T)(ByRef target As T, value As T) As T
        target = value
        Return value
    End Function
 
    Public Shared Sub Main()
        Dim tp As New TestPipe
        tp.TestPipe()
    End Sub
 
End Class

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 21.09.11 16:40

DaveS, sorry...

wie verwende ich den Source. Ich hab es getestet, bei mir tut sich nix außer 'ner Fehlermeldung.

Wie muß ich den Source verwenden, muß ich für den Test noch etwas ändern?

Ich hab hier vier VB.NET Bücher, in keinem wird auch nur ein Wort über Pipes verloren...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 16:55

Tja, du postest hier im Forum für Fortgeschrittene, und der Code ist ziemlich trivial.
Lege eine neue Konsolenanwendung an und kopiere den ganzen Code in die Module1 Datei. Dann F5 drücken. Und wenn du eine Fehlermeldung hast bitte sagen welche. Named Pipes waren neu mit FW 3.5, etwas ältere Bücher werden die Klassen nicht erwähnen. Und die meisten Autoren sind sowieso nicht so weit und es geht eher um übliche Sachen. Wenn du wirklich was lernen willst dann lies Joseph Albahari's "C# 4.0 in a Nutshell". Ist aber halt C#. Ein Named Pipe ist mehr oder weniger wie eine Datei, die man schreiben und lesen kann, nur was man schreibt kommt am anderen Ende wieder raus anstatt stecken zu bleiben.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 21.09.11 17:11

Ich hatte es zwar etwas anders gemacht, aber ich bekomme auch so die gleiche Meldung:

in der ThreadStartClient bekomme ich in der vorletzten Zeile End Using einen Fehler:

ObjectDisposedException wurde nicht gefunden
Auf eine geschlossene Pipe kann nicht zugegriffen werden

Irgendwie verstehe ich es nicht, müßte ich nicht ein zweites Programm oder eine zweite Ebene öffnen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 21.09.11 18:02

Ich bin ein kleines Stück weiter.

Ich hab meinen Fehler gefunden. Der Source mußte in eine ConsolenApplikation

Ok.

Jetzt hab ich zweit teile erstellt, einmal für Server , einmal für Client.

Auch OK.

Zumindest solange wie beides auf einem Rechner läuft.

Was muß ich jetzt ändern, damit ich server und Client auf unterschiedlichen Rechnern betreiben kann???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: ModeratorDaveS (Moderator)
Datum: 21.09.11 18:22

Der Servercode muss halt am Server laufen und der Clientcode im Client. Wahrscheinlich solltest du in der Serveranwendung auch einen Thread starten, da der Code immer auf Nachrichten vom Client warten sollte, und sonst hängt die ganze Anwendung (was immer das ist). Dann musst du den Servernamen angeben für den Client. In der Clientanwendung kannst du wahrscheinlich einen Timer verwenden um regelmäßig den Server abzufragen.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: Tommi467
Datum: 29.09.11 14:00

Dave?

Ich hoffe du ließt diese Nachricht.
Ich komme irgendwie nicht weiter und bin am verzeweifeln.

Zwar bekomme ich einen funktionierenden Server-Client Dienst ans laufen.
aber leider eben nur als Console.

Wie kann ich das den jetzt für meine Software benutzen, das ist doch eine Form...

wäre schön, wenn du mir noch einmal einen Tipp geben könntest.

Vielen Dank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? 
Autor: ModeratorDaveS (Moderator)
Datum: 29.09.11 16:26

Ok, eine Windows Forms Version (schnell geschrieben und nicht besonders gut getestet). Diesmal zwei Projekte.

Client (TextBox - CommandInput, Button - SendButton, RichTextBox - LogData)
Imports System.IO
Imports System.IO.Pipes
Imports System.Threading
 
Public Class Form1
 
    Private pipeStream As NamedPipeClientStream
    Private sw As StreamWriter
    Private sr As StreamReader
 
    Public Sub SendData(data As String)
 
        If pipeStream Is Nothing Then
            pipeStream = New NamedPipeClientStream("mytestpipe")
            pipeStream.Connect()
            addLine("[Client] Pipe connection established")
            sw = New StreamWriter(pipeStream)
            sw.AutoFlush = True
        End If
 
        addLine("[Client] send data: " & data)
        sw.WriteLine(data)
        If data = "time" Then
            If sr Is Nothing Then
                sr = New StreamReader(pipeStream)
            End If
            Dim response As String = sr.ReadLine()
            addLine("[Response] time=" & response)
        End If
 
    End Sub
 
    Private Sub addLine(line As String)
        LogData.AppendText(line & vbCrLf)
        LogData.SelectionLength = LogData.TextLength
        LogData.ScrollToCaret()
    End Sub
 
    Private Sub SendButton_Click(sender As System.Object, e As _
      System.EventArgs) Handles SendButton.Click
        If CommandInput.Text IsNot String.Empty Then
            SendData(CommandInput.Text)
            CommandInput.Clear()
        End If
    End Sub
 
    Private Sub Form1_FormClosing(sender As Object, e As _
      System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If pipeStream IsNot Nothing Then pipeStream.Close()
    End Sub
 
End Class
Server (RichTextBox - LogData)
Imports System.IO
Imports System.IO.Pipes
Imports System.Threading
 
Public Class Form1
 
    Public Sub ThreadStartServer()
 
        Using pipeStream As New NamedPipeServerStream("mytestpipe")
            addLine("[Server] Pipe created")
            pipeStream.WaitForConnection()
            addLine("[Server] Pipe connection established")
 
            Using sr As New StreamReader(pipeStream),
                sw As New StreamWriter(pipeStream)
                sw.AutoFlush = True
                Dim temp As String = String.Empty
 
                While (assign(temp, sr.ReadLine())) IsNot Nothing
                    Dim dt As DateTime = DateTime.Now
                    addLine(String.Format("[Server] {0}: {1}", dt, temp))
                    If temp = "time" Then
                        sw.WriteLine(dt.ToString())
                    End If
                End While
            End Using
        End Using
 
        addLine("[Server] Connection closed")
    End Sub
 
    Private Sub addLine(line As String)
        If InvokeRequired Then
            Invoke(New Action(Of String)(AddressOf addLine), New String() _
              {line})
            Return
        End If
        LogData.AppendText(line & vbCrLf)
        LogData.SelectionLength = LogData.TextLength
        LogData.ScrollToCaret()
    End Sub
 
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
      Handles MyBase.Load
        Dim ServerThread As New Thread(AddressOf ThreadStartServer)
        ServerThread.IsBackground = True
        ServerThread.Start()
    End Sub
 
    Private Shared Function assign(Of T)(ByRef target As T, value As T) As T
        target = value
        Return value
    End Function
 
End Class

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden 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