Über TCP/IP Daten Senden

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

    Über TCP/IP Daten Senden

    Hallo,

    hab vom Tutorial "Ausführliches TCP und UDP Turorial" Den Code verwendet.

    Ein Projekt mit dem Client und ein Projekt mit dem Server. Nur empfange ich nichts. Kann mir bitte jemand helfen

    hier mein Code für den Server

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Public Class Form1
    5. 'Variablen:
    6. Dim stream As NetworkStream
    7. Dim streamw As StreamWriter
    8. Dim streamr As StreamReader
    9. Dim Server As TcpListener
    10. Dim client As New TcpClient
    11. Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)
    12. Dim mainthread As Threading.Thread
    13. '______________
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. mainthread = New Threading.Thread(AddressOf mainserver)
    16. mainthread.Start()
    17. End Sub
    18. Sub mainserver()
    19. ' Try
    20. Server = New TcpListener(ipendpoint)
    21. Server.Start()
    22. client = Server.AcceptTcpClient
    23. stream = client.GetStream
    24. streamr = New StreamReader(stream)
    25. streamw = New StreamWriter(stream) ' Müsste eigentlich alles Klar sein.
    26. While True
    27. Select Case streamr.ReadLine
    28. Case "onl" ' und so weiter eigentlich müsste es heißen select case mid(streamr.readline,1,3) Aber da des ja vielen zu Kompiziert ist lass ich das mal weg^^
    29. streamw.WriteLine("ok") ' Achtung! ist nicht Vollständig!
    30. streamw.Flush() ' Code muss angepasst werden.....
    31. Case "...." ' ......
    32. Case "logoff" '........
    33. End Select
    34. End While
    35. ' Catch
    36. ' Hier wieder eine Fehler behandlung und ein neuen Versuch den Server zu starten...
    37. ' End Try
    38. End Sub
    39. Private Sub Form1__close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
    40. Server.Stop()
    41. Try
    42. mainthread.Abort()
    43. Catch
    44. End Try
    45. End Sub
    46. End Class


    und hier der Code für den Client

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. 'Variablen:
    5. Dim stream As NetworkStream
    6. Dim streamw As StreamWriter
    7. Dim streamr As StreamReader
    8. Dim Client As New TcpClient
    9. Dim IP As String = "127.0.0.1"
    10. Dim Port As Integer = 4000
    11. Dim loginname As String = "abc" ' Diese Variable ist nicht Pflicht! Aber nützlich für ein Chatprogram...
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. 'Button1 wird geclickt
    14. Client.Connect(IP, Port) 'Client verbindet sich mit IP: 192.168.111.17 und Port 4000
    15. If Client.Connected Then
    16. stream = Client.GetStream ' Stream wird auf Client verwiesen
    17. streamw = New StreamWriter(stream) ' Stream zum Senden wird deklariert
    18. streamr = New StreamReader(stream) ' Stream zum Empfangen wird deklariert
    19. login() ' Sub Login
    20. Else
    21. MsgBox("Verbidnung konnte nicht mit " & IP & " aufgebaut werden!")
    22. End If
    23. End Sub
    24. Sub client_send(ByVal text As String)
    25. streamw.WriteLine(text)
    26. streamw.Flush()
    27. End Sub
    28. Function client_recieve() As String
    29. client_recieve = streamr.ReadLine
    30. End Function
    31. ' Nach der erfolgreichen verbindung mit der IP und dem Port wird dieser Sub aufgerufen:
    32. Sub login()
    33. 'Try
    34. client_send("onl " & loginname)
    35. If client_recieve() = "ok" Then 'Oder sonst irgend was. Ist nur ein Beispiel für einen Login
    36. Send_irgendwas() ' Hier kann gehts zum nächsten sub um irgend welche Daten zu versenden...
    37. Else
    38. Exit Sub
    39. End If
    40. ' Catch
    41. ' End Try
    42. End Sub
    43. Sub Send_irgendwas()
    44. client_send("Irgendwas")
    45. If client_recieve() = "Auch wieder irgendwas..." Then
    46. '.....
    47. Else
    48. '....
    49. End If
    50. Client.Close()
    51. End Sub
    52. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    53. End Sub
    54. End Class


    auf Client Seite bleibt das Programm bei

    VB.NET-Quellcode

    1. Function client_recieve() As String
    2. client_recieve = streamr.ReadLine
    3. End Function


    hängen

    vbneuling88 schrieb:

    VB.NET-Quellcode

    1. client_recieve = streamr.ReadLine
    wartet auf eine Zeile, und eine Zeile wird mit einem <CR>, ggf. <CR><LF> beendet.
    Häng an den Text ein Environment.NewLine hinten dran.
    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!

    VB.NET-Quellcode

    1. client_send("Irgendwas" & Environment.NewLine)


    Funktioniert auch nicht

    Folgende Funktion schreibt ja eine Zeile

    VB.NET-Quellcode

    1. Sub client_send(ByVal text As String)
    2. streamw.WriteLine(text)
    3. streamw.Flush()
    4. End Sub


    Ist dann das nötig Environment.NewLinenötig?


    Fehler wurde gefunden. Der Client sendet an den Server

    VB.NET-Quellcode

    1. client_send("onl " & loginname)


    der Server wartet aber auf

    VB.NET-Quellcode

    1. Select Case streamr.ReadLine
    2. Case "onl" ' und so weiter eigentlich müsste es heißen select case mid(streamr.readline,1,3) Aber da des ja vielen zu Kompiziert ist lass ich das mal weg^^
    3. streamw.WriteLine("ok") ' Achtung! ist nicht Vollständig!
    4. streamw.Flush()

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

    vbneuling88 schrieb:

    Ist dann das nötig Environment.NewLine nötig?
    Was genau erwartet der Empfänger?
    Kann das auch ein <EOT> sein (End Of Transmission = 4)?
    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!
    Hi, warum wird mir die Variable a, b, c, d nicht beschrieben,
    Zeigt immer 0 an

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Module tcp_server
    5. 'Variablen:
    6. Dim stream As NetworkStream
    7. Dim streamw As StreamWriter
    8. Dim streamr As StreamReader
    9. Dim Server As TcpListener
    10. Dim client As New TcpClient
    11. Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)
    12. Dim eingang As String
    13. Public mainthread As Threading.Thread
    14. Public Sub start_tcp_server()
    15. mainthread = New Threading.Thread(AddressOf mainserver)
    16. mainthread.Start()
    17. End Sub
    18. Public Sub stop_tcp_server()
    19. Server.Stop()
    20. mainthread.Abort()
    21. End Sub
    22. Sub mainserver()
    23. Try
    24. Dim verbindung As Boolean = True
    25. Server = New TcpListener(ipendpoint)
    26. Server.Start()
    27. client = Server.AcceptTcpClient
    28. stream = client.GetStream
    29. streamr = New StreamReader(stream)
    30. streamw = New StreamWriter(stream) ' Müsste eigentlich alles Klar sein.
    31. While verbindung
    32. eingang = streamr.ReadLine
    33. Select Case eingang
    34. Case "verbinden" ' befehl zum Verbinden von Client
    35. streamw.WriteLine("ok")
    36. streamw.Flush()
    37. Case "trennen"
    38. verbindung = False
    39. Server.Stop()
    40. mainthread.Abort()
    41. Case Else
    42. Dim pruefplatz As String = eingang.Substring(0, 3)
    43. Select Case pruefplatz
    44. Case "PP1"
    45. Dim a As Single = frmMain.MODUL_A12_FERTIG(0)
    46. Dim b As Single = frmMain.MODUL_A12_FERTIG(1)
    47. Dim c As Single = frmMain.MODUL_A12_FERTIG(2)
    48. Dim d As Single = frmMain.MODUL_A12_FERTIG(3)
    49. streamw.WriteLine("PP1" & ";" & 5.5 & ";" & frmMain.MODUL_A12_FERTIG(1) & ";" & frmMain.MODUL_A12_FERTIG(2).ToString & ";" & frmMain.MODUL_A12_FERTIG(3).ToString)
    50. streamw.Flush()
    51. ...
    52. End Select
    53. End While
    54. Catch
    55. frmMain.fehler_tcp = True
    56. End Try
    57. End Sub
    58. End Module
    Gib Deinem Programm zunächst Option Strict On.
    Wo wird was / nix angezeigt?
    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!
    Wo ist MUDIL_A12_FERTIG deklariert?
    Meine Kristallkugel is grade zur Reparatur.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Wo erstellst du das "MODUL_A12_FERTIG"-Etwas??
    Wo füllst du es??


    Wird überhaupt eine Verbindung zwischen Server und Client aufgebaut??
    Hab deinen unübersichtlichen Code jetzt nur überflogen, aber wenn keine Verbindung aufgebaut werden kann, kann auch nix iwo ausgelesen werden ...
    also MODUL_A12_FERTIG() ist global als Public deklariert in der Haupt WindowsForms.
    Werte werden für RS232 eingelesen, Berechnet und auf MODUL_A12_FERTIG() geschrieben.

    Die Kommunikation mit dem Client funktioniert auch wunderbar, allerdings wird bei

    Dim a As Single = frmMain.MODUL_A12_FERTIG(0), nichts an a Übergeben, Obwohl MODUL_A12_FERTIG(0) mit einem Wert > 0 hinterlegt ist.
    Zeig bitte mal den dies machenden Code:

    vbneuling88 schrieb:

    Werte werden für RS232 eingelesen, Berechnet und auf MODUL_A12_FERTIG() geschrieben.
    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!

    VB.NET-Quellcode

    1. Public Sub lese_Modul_A12()
    2. m_Adam4000Type = Adam4000Type.Adam4017P
    3. Dim values() As Single
    4. Dim status() As Adam4000_ChannelStatus
    5. 'Modul_A12 0-20 mA Eingänge
    6. If frmMain.simulation_aktiv = False Then
    7. For i As Byte = 0 To 5
    8. If adamCom.AnalogInput(12).GetValues(8, values, status) = True Then
    9. frmMain.MODUL_A12(i) = values(i)
    10. End If
    11. Next
    12. End If
    13. End Sub

    wird jede Sekunde aufgerufen


    VB.NET-Quellcode

    1. Public Function BerechnungTemp(ByRef wert As Single, ByRef text As String)
    2. Dim min As Single = 0
    3. Dim max As Single = 100
    4. If wert < 3.5 Then
    5. frmMain.fehler_erkannt = True
    6. frmERROR.showme("Analogwert von " & text & " zu niedgrig")
    7. Return 0
    8. End If
    9. Return (CSng((max - min) / 16 * wert - (max - min) / 16 * 4))
    10. End Function


    VB.NET-Quellcode

    1. Private Sub Timer_lese_fuehler_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_lese_fuehler.Tick
    2. lese_MODUL_A12()
    3. MODUL_A12_FERTIG(0) = BerechnungTemp(MODUL_A12(0), "Vorlauf PP1")
    4. ...
    5. End Sub



    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. einstellungen_laden()
    3. tcp_server.start_tcp_server()
    4. ...

    vbneuling88 schrieb:

    VB.NET-Quellcode

    1. For i As Byte = 0 To 5
    2. If adamCom.AnalogInput(12).GetValues(8, values, status) = True Then
    3. frmMain.MODUL_A12(i) = values(i)
    4. End If
    5. Next
    Es sieht aus, dass GetValues() hier False zurückgibt.
    Setze einen Haltepunkt drauf und überzeuge Dich davon, dass hier das richtige passiert.
    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!

    vbneuling88 schrieb:

    also MODUL_A12_FERTIG() ist global als Public deklariert in der Haupt WindowsForms.
    Werte werden für RS232 eingelesen, Berechnet und auf MODUL_A12_FERTIG() geschrieben.

    Die Kommunikation mit dem Client funktioniert auch wunderbar, allerdings wird bei

    Dim a As Single = frmMain.MODUL_A12_FERTIG(0), nichts an a Übergeben, Obwohl MODUL_A12_FERTIG(0) mit einem Wert > 0 hinterlegt ist.

    Das hab ich ja schon gemacht, beim Letzten mal stand 67,5 drinnen.

    Hat das irgendwas mit

    VB.NET-Quellcode

    1. mainthread = New Threading.Thread(AddressOf mainserver)
    2. mainthread.Start()

    zu tun?


    Der Server wird bei Programmstart einmal gestartet und bei Programmende gestoppt...

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

    kann ich mit diesem Server/Client System vom Server variable Zeichen an den Client senden?

    zu Erklärung.
    Der Client Verbindet sich
    Sendet einen Befehl an den Server mit der Aufforderung, dass der Server Werte an den Client zurücksenden soll (als Werte können z.B. Temperaturwerte der CPU, oder irgendwelche werte, welche zuvor vom Programm berechnet wurden)
    Client erhält die Werte und Sendet neuen Befehl an den Server


    Oder Muss Dazu ein Multiserver eingerichtet werden?

    *Vollzitat entfernt*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    vbneuling88 schrieb:

    kann ich mit diesem Server/Client System vom Server variable Zeichen an den Client senden?
    Ja.
    Wozu zitierst Du Deinen eigenen riesigen Post? Das überspringen zu müssen nervt etwas.
    1. Lass die riesigen Zitate
    2. Nutze den Expander [+] neben dem [VB]-Tag. Nutze außerdem den Vorschau-Button.
    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!
    Moin,

    @vbneuling88::
    hab nicht alles gelesen, aber hast du dran gedacht den StreamWriter zu flushen? Also mit .Flush() (jedes Mal) bzw. .AutoFlush = True (einmalig).
    msdn.microsoft.com/de-de/libra…o.streamwriter.flush.aspx
    msdn.microsoft.com/de-de/libra…reamwriter.autoflush.aspx
    Mit freundlichen Grüßen,
    Thunderbolt

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

    Ja hab ich. Nach jedem Write kommt ein Flush.

    das komische ist ja, dass der Server Festwerte (egal ob String oder Single oder int16) zum Client sendet, aber sobald ich auf eine Variable aus einem Anderen modul zugreifen will, um diese zu senden, Wird nur eine 0 übertragen

    vbneuling88 schrieb:

    aber sobald ich auf eine Variable aus einem Anderen modul zugreifen will,
    Mit welchem Code machst Du das?
    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!
    Auf Zeile 29 wird eine Variable von frmMain abgefragt. diese wird alle 500 ms mit now.second beschrieben (um mal einen wert zu haben), allerdings empfange ich beim Client nur "0".
    Jedoch auf Zeile 20 und 24 werden die Strings genauso an den Client gesendet wie gewünscht


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub mainserver()
    2. Dim verbindung As Boolean = True
    3. Server = New TcpListener(ipendpoint)
    4. Server.Start()
    5. client = Server.AcceptTcpClient
    6. stream = client.GetStream
    7. streamr = New StreamReader(stream)
    8. streamw = New StreamWriter(stream)
    9. While verbindung
    10. eingang = streamr.ReadLine
    11. Select Case eingang
    12. Case "verbinden"
    13. streamw.WriteLine("verbunden")
    14. streamw.Flush()
    15. Case "trennen"
    16. verbindung = False
    17. Server.Stop()
    18. mainthread.Abort()
    19. Case Else
    20. streamw.WriteLine(frmMain.testa)
    21. streamw.Flush()
    22. End Select
    23. End While
    24. End Sub