kostenloser Webspace werbefrei: lima-city


VB.net TCPverbindung

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi
    Ich möchte wie gesagt, eine Verbindung von 2 programmen (Server & Client) herstellen. Mit VB.Net geht dass ja soweit ich weiss über
    Imports System.Net.Sockets
    deutlich einfacher als bei VB6. Allerdings verstehe ich das ganze noch nicht so 100%ig und alles was ich dazu finden kann im Internet ist viel zu komplex ode r zu umständlich erklärt, als dass ich wirklich verstehen würde was ich mache. Was ich alse brauche ist Verbindungsaufbau der beiden Programme und die möglichkeit dann Daten auszutauschen. Ich hoffe das ist nicht zu viel verlangt ;)
    Vielen Dank schonmal & MFG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo programtools,

    bei mir liefert Google bei der ersten Suche gleich einen brauchbaren Treffer:
    http://www.eggheadcafe.com/articles/20020323.asp
    Aber ich kann ja mal ein paar Sachen etwas ausführlicher kommentieren.

    Schauen wir uns zuerst den Client an:
    Dim tcpClient As New System.Net.Sockets.TcpClient()
     tcpClient.Connect("127.0.0.1", 8000)

    Hier wird zuerst ein Socket-Objekt erzeugt. Ein Socket-Objekt ist die programm-interne Repräsentation für Verbindungen Über TCP/IP.
    Damit kann man Verbindungen herstellen und diese wieder trenne. In der zweiten Zeile wird eine solche Verbindung hergestellt und zwar mit einem Server auf dem lokalen Rechner (127.0.0.1 = localhost), der auf Port 8000 wartet.

    Dim networkStream As NetworkStream = tcpClient.GetStream()
    If networkStream.CanWrite And networkStream.CanRead Then
    ...
    Else
    ... <error handling>
    End If

    Da man mit dem Socket alleine noch nicht wirklich was anfangen kann, schließlich will man ja Daten senden und empfangen, lässt man sich vom Socket eine Stream geben, von dem man lesen und auf den man schreiben kann. Ein Stream ist eine Verallgemeinerung bzw. Abstraktion von Objekten, auf die man schreiben oder von denen man lesen kann. Streams stellen dafür Methoden wie Read() und Write() zur Verfügung. In der If-Abfrage wird überprüft, ob man auf den Stream schreiben und von ihm lesen kann und falls nicht in die Fehlerbehandlung gegangen.

    Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there")
    networkStream.Write(sendBytes, 0, sendBytes.Length)
    
    Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
    
    ' Output the data received from the host to the console.
    Dim returndata As String = Encoding.ASCII.GetString(bytes)

    Jetzt kommen wir zum eigentlichen Daten Senden und Empfange. In der ersten Zeile wird der zu sendende String in ein Byte-Array umgewandelt. Das Senden geschieht in der zweiten Zeile mit Hilfe der Write() Methode. Dabei wird das Byte-Array, der Startindex und die Anzahl der zu sendende Bytes übergeben.
    In Zeile 4 wird ein Byte-Array zum Empfangen angelegt. Dieses wird mit der Größe des Emfpangspuffers im Socket dimensioniert.
    Danach werden mit Read() die Bytes aus dem Emfpangspuffer in das Byte-Array kopiert. Die Argumente sind das Array, der Startindex und die maximale Anzahl an zu kopierenden Bytes.

    tcpClient.Close()

    Gut das ist im Beispiel Code nicht drin, aber wenn man fertig ist, dann soll man die Verbindung auch wieder trennen.

    Schauen wir uns jetzt den Server an, wobei ich nur die Unterschiede beschreibe:

    Const portNumber As Integer = 8000
    Dim tcpListener As New TcpListener(portNumber)
    tcpListener.Start()

    Hier wird ein TcpListener-Objekt erstellt und gestartet. Das Argument des Konstruktors ist der Port (der gleiche wie beim Client).
    Der TcpListener sorgt dafür, dass das Betriebssystem eingehende Verbindungsversuche auf Port 8000 an Dein Programm weiterleitet (sofern keine Firewall dazwischen ist).

    Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()

    Hier sieht man, wie auf eine eingehende Verbindung gewartet wird. Die Methode AcceptTcpClient() wartet so lange, bis ein Client eine Verbindung zu diesem Server aufbaut. Wenn eine Verbindung aufgebaut wurde, dann gibt sie ein TcpClient-Object zurück. Ab jetzt geht es erst einmal weiter wie beim Client.

    tcpClient.Close()
    tcpListener.Stop()

    Hier wird wieder die Verbindung getrennt. In der zweiten Zeile wird der TcpListener gestoppt, d.h ab hier wird Dein Programm nicht mehr über eingehende Verbindungsversuche informiert.

    Ich hoffe, das hilft ein wenig.


    Beitrag zuletzt geändert: 31.1.2011 21:24:13 von darkpandemic
  4. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Auf den Artikel bin ich auch 100 mal gestoßen ;) konnte nur nicht soviel damit anfangen.
    Ich verstehe das mit den Daten nur nicht so ganz die gesendet und empfangen werden. DAs sieht so umständlich aus. Und was wird jetzt genau gemacht, wenn daten ankommen? Wird dann irgendein sub ausgeführt oder sowas wo ich die Daten verarbeiten kann?
    Vielen Dank & MFG
  5. Hallo programtools,

    im Vergleich zu C/C++ (Client, Server) sieht das sehr sehr einfach aus ;-)
    Also schauen wir uns das mit dem Senden und Empfangen nochmal an:
    Gesendet wird mit der NetworkStream.Write() Methode. Die Daten, die Du senden willst musst Du vorher in ein Byte-Array umwandeln, was ganz einfach daran liegt, dass die Write()-Methode nur mit Byte-Arrays umgehen kann.
    Wenn Du die Methode aufrufst, dann werden die Daten in den Ausgabepuffer des Sockets(tcpClient im Beispiel) geschrieben und die Write()-Methode kehrt zurück. Die Daten werden dann mittels TCP/IP zum Eingangspuffer der Servers übertragen (wenn dabei nichts schief geht). Um die Daten aus dem Eingangspuffer zu lesen verwendet man die NetworkStream.Read() Methode. Wenn keine Daten vorhanden sind, dann wartet diese Methode bis welche da sind und kopiert diese aus dem Eingangspuffer in das von Dir vorgegebene Array (bytes im Beispiel). Diese Daten werden dabei aus dem Eingangspuffer gelöscht. Es gilt ebenfalls, dass die Read()-Methode nur mit Byte-Arrays umgehen kann. Nach einem erfolgreichen Read() sind dann die gesendeten Daten im Byte-Array. Aber man muss aufpassen, da es sein kann, das mehrere Datenpakete im Byte-Array vorhanden sind wenn der Client mehrmals sendet, bevor Read() aufgerufen wird. Read() liest in diesem Fall alle auf einmal.
    Jetzt kannst Du dieses Array an eine Sub zum Verarbeiten übergeben bzw. erst einmal die Daten in den eigentlichen Datentyp zurückkonvertieren und dann weiterverarbeiten.
    In dem Beispiel-Code werden die empfangenen Bytes einfach in einen String konvertiert und dann auf die Konsole ausgegeben.
  6. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Vielen Dank! Klappt alles soweit Super ;)
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!