Problem mit TCP Server - Server liest nicht oder Client schreibt nicht

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von uwap.

    Problem mit TCP Server - Server liest nicht oder Client schreibt nicht

    Hallo Community,

    Ich programmiere derzeit ein Online strategie Spiel mit visual basic express 2008.
    Ich habe mir eine Libary für den Server und den Clienten erstellt:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Public Class NetWorker
    5. Public Class server
    6. Private serv As TcpListener
    7. Private client As New TcpClient
    8. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
    9. Private list As New List(Of Connection)
    10. Public Event work(ByVal message As String, ByVal con As Connection)
    11. Public Structure Connection
    12. Dim stream As NetworkStream
    13. Dim streamw As StreamWriter
    14. Dim streamr As StreamReader
    15. Dim nick As String
    16. Dim privateInteraction As Boolean
    17. End Structure
    18. Public Sub SendToAllClients(ByVal s As String)
    19. For Each c As Connection In list
    20. Try
    21. If c.privateInteraction = False Then
    22. c.streamw.WriteLine(s)
    23. c.streamw.Flush()
    24. End If
    25. Catch
    26. End Try
    27. Next
    28. End Sub
    29. Public Sub SendToClient(ByVal s As String, ByVal nick As String)
    30. For Each c As Connection In list
    31. Try
    32. If c.nick = nick Then
    33. c.streamw.WriteLine(s)
    34. c.streamw.Flush()
    35. End If
    36. Catch
    37. End Try
    38. Next
    39. End Sub
    40. Public Sub start(ByVal Port As String, Optional ByVal ServerStartMessage As String = "Der Server wurde gestartet")
    41. ipendpoint = New IPEndPoint(IPAddress.Any, Port)
    42. Console.WriteLine(ServerStartMessage)
    43. serv = New TcpListener(ipendpoint)
    44. serv.Start()
    45. While True
    46. console.writeline(".")
    47. client = serv.AcceptTcpClient
    48. Dim c As New Connection
    49. c.stream = client.GetStream
    50. c.streamr = New StreamReader(c.stream)
    51. c.streamw = New StreamWriter(c.stream)
    52. c.nick = c.streamr.ReadLine
    53. list.Add(c)
    54. Console.WriteLine(c.nick & " has joined.")
    55. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    56. t.Start(c)
    57. End While
    58. End Sub
    59. Private Sub ListenToConnection(ByVal con As Connection)
    60. Do
    61. Try
    62. Dim tmp As String = con.streamr.ReadLine
    63. RaiseEvent work(tmp, con)
    64. Catch : Console.WriteLine(con.nick & " has left.") : End Try
    65. Loop
    66. Console.WriteLine(con.nick & " has left.")
    67. End Sub
    68. End Class
    69. Public Class ClientWorker
    70. Private stream As NetworkStream
    71. Private streamw As StreamWriter
    72. Private streamr As StreamReader
    73. Private client As New TCPclient
    74. Private t As New Threading.Thread(AddressOf Listen)
    75. Public Event connectionLost()
    76. Public Event cantConnect()
    77. Public Event connected()
    78. Public Event work(ByVal read As String)
    79. Public Sub connect(ByVal ip As String, ByVal port As String, ByVal nick As String)
    80. Try
    81. client.Connect(ip, port)
    82. If client.Connected Then
    83. stream = client.GetStream
    84. streamw = New StreamWriter(stream)
    85. streamr = New StreamReader(stream)
    86. streamw.WriteLine(nick)
    87. streamw.Flush()
    88. t.Start()
    89. RaiseEvent connected()
    90. Else
    91. RaiseEvent connectionLost()
    92. End If
    93. Catch ex As Exception
    94. RaiseEvent cantConnect()
    95. End Try
    96. End Sub
    97. Private Sub Listen()
    98. While client.Connected
    99. Try
    100. RaiseEvent work(streamr.ReadLine)
    101. Catch
    102. RaiseEvent connectionLost()
    103. End Try
    104. End While
    105. RaiseEvent connectionLost()
    106. End Sub
    107. Public Sub stopClient()
    108. t.Suspend()
    109. End Sub
    110. Public Sub writeToServer(ByVal s As String)
    111. streamw.WriteLine(s)
    112. End Sub
    113. End Class
    114. End Class


    Nun habe ich den server erstellt:

    VB.NET-Quellcode

    1. WithEvents server As New LJLib.NetWorker.server
    2. Sub Main()
    3. server.start("25565")
    4. End Sub
    5. '[...]
    6. Private Sub ListenToConnection(ByVal tmp As String, ByVal con As LJLib.NetWorker.server.Connection) Handles server.work
    7. '[...]
    8. If tmp = "[Map]" Then
    9. con.privateInteraction = True
    10. Console.WriteLine(con.nick + " fordert die map daten")
    11. End If
    12. '[...]
    13. End Sub


    Dann habe ich den code für den clienten geschrieben:

    VB.NET-Quellcode

    1. Private Sub client_connected() Handles client.connected
    2. client.writeToServer("[Map]")
    3. MsgBox("MAP SENT")
    4. End Sub
    5. Private Sub m_listen(ByVal read As String) Handles client.work
    6. If mapLoaded = False Then
    7. m_mapgen(read)
    8. End If
    9. End Sub


    Natürlich habe ich bei Form2.shown client.start

    so nun wenn ich das programm starte und mich einlogge, seh ich zwar im server das ich mich eingeloggt habe, aber nicht das ich die map daten anfordere, geschweige denn erhalte ich die mapdaten. Ich hoffe ihr habt einen rat für mich.

    Gruß, UWAP
    Port als Integer definieren und nicht als String, ist mal eine klare Sache :P
    Dann würde ich z.B. mal einen Haltepunkt setzen (Zeile 12 - 2ter Codeteil), dann merkst du ob es vlt. an der If-Abfrage liegt...
    Bzw. ich würde einmal einen Server mit Telnet starten, mit dem Client verbinden und entsprechend bei Telnet Manuell die Daten senden, ebenso natürlich noch umgekehrt...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also das verbinden mit dem server klappt.

    "Me has joined."

    Es ist egal ob ich den port als string oder als int angebe.

    Nach ein bisschen testen habe ich gemerkt das der fehler bei irgendeiner schleife liegen könnte, denn ich habe bei dem server mir einfach mal ein "." ausgeben lassen, der punkt wurde nicht ausgegeben...

    Den fehler finde ich trotzdem nicht :/
    Entweder bin ich grad einfach nur blind oder ich hab irgendwas übersehn

    Edit: Zeile 50 in der lib wird auch nie ausgegeben, das einzige was ausgegeben wird ist "Me has joined"

    Edit2: Der fehler liegt denke ich hier:

    VB.NET-Quellcode

    1. Private Sub ListenToConnection(ByVal con As Connection)
    2. Do
    3. Try
    4. Dim tmp As String = con.streamr.ReadLine
    5. RaiseEvent work(tmp, con)
    6. Catch : Console.WriteLine(con.nick & " has left.") : list.Remove(con) : Exit Do : End Try
    7. Loop
    8. End Sub
    9. End Class

    Ich hab schon viel ausprobiert und getestet, ich finde ihn aber nicht

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