| |
VB.NET - Fortgeschrittenewie 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 | |
Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? | | | Autor: DaveS (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 | |
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... | |
Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? | | | Autor: DaveS (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 | |
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... | |
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? | |
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??? | |
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 | |
Re: wie Objekteigenschaften von Programm1 für Programm2 zugänglich machen? | | | Autor: DaveS (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 | |
| 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 |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|