TCP - Informationen senden

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Bowserkoopa.

    TCP - Informationen senden

    In letzter Zeit habe ich mich mal wieder mit VB.net an etwas drangemacht und probiere nun erstmals TCP Verbindungen aus. Dabei wollte ich einen Klienten und einen Server seperat erstellen. Ich hab es mir so vorgestellt, dass der Klient dem Server den Befehl gibt, eine Funktion in sich aufzurufen, und den Rückgabewert wieder zurückzusenden(z.b. auf dem Desktop befinden sich [Zahl] Ordner) . Bisher habe ich es mit Networkstreams gesehen aber da wird auf ByteBasis gearbeitet und das sieht mir recht kompliziert aus. Außerdem muss ich ja irgendwie dauernd auf eintreffende Streams abfragen. Wie setze ich das am einfachsten um?
    Hi.

    Einfach ist diese Thematik sicherlich nicht. Wenn du lernen willst, was auf der untersten Ebene passiert, musst du dich mit der Byteschieberei beschäftigen. Etwas einfacher geht es mit NetworkStreams, die einen gewissen Abstraktionsgrad besitzen. Noch eine Ebene höher steht das Remoting. Es unterstützt Funktionsaufrufe über das Netzwerk. Neuerdings preist Microsoft noch eine neue Technologie an, die noch einfach sein soll. Sie heißt WCF ("Windows Communication Foundation"). Mit jeder Abstraktionsschicht wird der Code, den su selbst schreiben musst, weniger. Das schließt jedoch ein, dass der Code, der unsichtbar im Hintergrund arbeitet, sehr viel umfangreicher wird. Dummerweise ist dessen Verständnis zumindest hilfreich, wenn Probleme auftreten. Da geht es dann um Dinge wie Formatierung, Serialisierung und Co., an die du beim einfachen Bytekopieren nicht mal denken würdest. Ich empfehle dir, damit anzufangen. Schau dir im MSDN die Socket-Klasse an und schreibe in je einer Konsolenanwendung Client und Server in synchroner Ausführung. Du solltest irgendwann bei zwei ineinander verschachtelten While-Schleifen angekommen sein. Windows Forms erfordern Threading, was das Ganze nur verkompliziert - lass es sein.

    Du musst übrigens nicht abfragen, ob neue Daten angekommen sind. Das System benachrichtigt dich, wenn das der Fall ist.
    Gruß
    hal2000
    Schlussendlich wird eh beides Schreib und Leserechte bekommen müssen, schließlich sollen Dateien ja von beiden Seiten aus auf den anderen PC transferiert werden. Das mit dem Networkstream hab ich mir jetzt eh mal angeschaut und jetzt sieht der Code bei mir ungefähr so aus. Mir fehlt nur das Kernstück, das auslesen und Senden von Daten selbst:

    VB.NET-Quellcode

    1. Dim DNSAdress As String = "127.0.0.1"
    2. Dim Port As Integer = "3232"
    3. Dim Server As New TcpListener(Port)
    4. Dim Klient As New TcpClient()
    5. 'Lesen und Schreiben + Netzwerkstream
    6. Dim NetzwerkDatenstream As NetworkStream = Klient.GetStream()
    7. Private SWriter As New StreamWriter(NetzwerkDatenstream)
    8. Private SReader As New StreamReader(NetzwerkDatenstream)
    9. 'Listener überprüft Verbindungen, Klient wertet sie aus
    10. Private Sub Server_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. 'Überwachung auf eingehende Verbindungen starten
    12. Server.Start()
    13. 'TCP verbinden
    14. Klient.Connect(DNSAdress, Port)
    15. 'Dauernd auf Infos aus dem Netz warten
    16. While True
    17. 'Hier sollte jetzt irgendwas Tolles stehen
    18. End While
    19. End Sub
    Bitte NIEMALS (ich meine niemals), also NIEMALS in der
    Form_Load()
    eine solche Schleife programmieren.
    Wenn da eine Exception kommt, kommt keine Exception, sondern Form_Load() wird abgebrochen.
    Nutze einen Button_Click() oder Timer_Tick() dafür.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, ist für die Zukunft vorgemerkt^^ Dann kommt eben ein Timer und ein Funktionsaufruf dazu. Sieht so ohnehin übersichtlicher aus :)

    EDIT: Übrigens kleienes Problem:

    VB.NET-Quellcode

    1. 'Überwachung auf eingehende Verbindungen starten
    2. Server.Start()
    3. Klient = Server.AcceptTcpClient
    4. 'TCP verbinden
    5. Klient.Connect(DNSAdress, Port)
    6. 'Stream aufrechtstellen
    7. NetzwerkDatenstream = Klient.GetStream()
    8. SWriter = New StreamWriter(NetzwerkDatenstream)
    9. SReader = New StreamReader(NetzwerkDatenstream)


    Er bleibt bei AcceptTCPClient stehen. Woran liegt das? Außerdem kam eine Firewallabfrage. Normalerweise sollte die doch nur bei den Klienten kommen, aber nicht von den Server?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bowserkoopa“ ()

    Nein, da die Firewall normalerweiße eingehende und ausgehende verbindungen Blockiert.

    Ah, wieder was dazugelernt ;)

    @hal2000: Wenn ich aber Klient und Server gleichzeitig öffne, dann bekomme ich eine Fehlermeldung: Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden
    Okay, soweit geht alles, aber ein kleines Problem gibt es noch. Das Überprüfen von Strings funktioniert im Socket nicht :/ Ich habe per Debugger überprüft, welchen Wert die erhaltenen Daten haben(i.d.F. "Connection") und versuche mittels if und = zu vergleichen ob es diesen Wert hat. Aber die Bedingung ist false? 8|

    Daten empfangen

    VB.NET-Quellcode

    1. 'Empfangene Daten
    2. Dim DataString As String = System.Text.Encoding.ASCII.GetString(Buffer)
    3. If (DataString = "Connection") Then
    4. MsgBox("Erfolg")
    5. End If



    EDIT: Hab schon herbekommen. Die Lösung war DataString.Contains zu verwenden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bowserkoopa“ ()