Client - Server Verbindung Problem

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Client - Server Verbindung Problem

    Hey,
    Ich habe ein Spiel gemacht, wo 3 Spieler mitmachen und jeder ein Auto(=Picturebox) steuern kann.
    Dafür habe ich einen Timer gemacht, der bei jeden Tick die Autos um 5 nach Rechts/Links/Vorne/Hinten (Je nach Richtung) verschiebt.
    Die Richtung kann nur der zum Auto gehörende Spieler verändern, aber die Nachricht wird dann mithilfe vom Server an alle Spieler gesendet, so dass alle Spieler die neue Richtung vom Spieler haben.
    Wenn nun der Spieler, dem das Auto gehört gegen eine Wand (=große Picturebox) fährt, so wird eine Nachricht an alle Spieler mithilfe vom Server gesendet und beim empfangen der Nachricht wird bei allen Spielern die Position vom Auto,
    dass gegen die Wand gefahren ist auf den Startplatz zurückgesetzt.
    Das Klappt auch gut (Alle Autos sind gleichschnell), aber nur wenn das ganze allein auf meinen Computer läuft, also wenn ich die 3 Clients + den Server offen habe.
    Wenn ich allerdings auf meinen PC den Server habe und auf einen anderen Computer die Clients, dann sind die Autos unterschiedlich schnell und das ganze sieht iwie verbuggt aus.
    Ich denke es liegt iwie an der Server Übertragung... jemand eine Idee wie man das Problem beheben kann?

    *Topic verschoben*

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

    @Robin7 Wie sieht denn die LAN-Verbindung zu den anderen PCs aus?
    Was haben die anderen PCs so "unter der Haube"?
    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!
    Alle PC´s haben LAN-Verbindung. Soll ich mal Probieren das LAN-Kabel rauszumachen und über WLAN?
    "Unter der Haube" = welche Hardware? Jetzt nicht mega schnell, aber sollte reichen.
    Ich denke aber wie gesagt, dass es daran liegt das zwischen Übertragung der Nachricht iwelche Verzögerungen kommen oder so (Kenne mich überhaupt nicht aus mit sowas)
    @Robin7 WLAN ist definitiv langsamer.
    Kannst Du mal den Server-Code posten?
    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!
    Ja klar, aber im Server-Code steht glaub ich nicht soviel entscheidendes(glaub wichtiger ist der Code vom Client)
    Hier der Server-Code(Hab noch nen Register und Login-System und hinterher das abspeichern von Siegen und Niederlagen in einer INI-Datei und noch mehr, aber das ist
    hierbei nicht relevant und ich habe das gekürzt Übersicht halber.
    Code:

    VB.NET-Quellcode

    1. ​Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Module Module1
    5. 'Variablen
    6. Dim spieleraufserver As Integer
    7. Dim spielerinlobby As Integer
    8. Dim spieler1inlobby As String
    9. Dim spieler2inlobby As String
    10. Dim spieler3inlobby As String ' Spiel startet
    11. Private server As TcpListener
    12. Private client As New TcpClient
    13. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
    14. Private list As New List(Of Connection)
    15. Private Structure Connection
    16. Dim stream As NetworkStream
    17. Dim streamw As StreamWriter
    18. Dim streamr As StreamReader
    19. End Structure
    20. Sub Main()
    21. Console.WriteLine("Der Server läuft!")
    22. server = New TcpListener(ipendpoint)
    23. server.Start()
    24. While True
    25. client = server.AcceptTcpClient
    26. Dim c As New Connection
    27. c.stream = client.GetStream
    28. c.streamr = New StreamReader(c.stream)
    29. c.streamw = New StreamWriter(c.stream)
    30. list.Add(c)
    31. spieleraufserver = list.Count
    32. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    33. t.Start(c)
    34. End While
    35. End Sub
    36. Private Sub ListenToConnection(ByVal con As Connection)
    37. Do
    38. Try
    39. Dim tmp As String = con.streamr.ReadLine
    40. If tmp.StartsWith("willspielen") Then
    41. If spielerinlobby = 3 Then
    42. tmp = ("lobbyvoll" & tmp.Remove(0, 11))
    43. Else
    44. spielerinlobby += 1
    45. If spielerinlobby = 1 Then
    46. spieler1inlobby = tmp.Remove(0, 11)
    47. tmp = ("lobby1" & tmp.Remove(0, 11))
    48. End If
    49. If spielerinlobby = 2 Then
    50. spieler2inlobby = tmp.Remove(0, 11)
    51. tmp = ("lobby2" & tmp.Remove(0, 11))
    52. End If
    53. If spielerinlobby = 3 Then
    54. spieler3inlobby = tmp.Remove(0, 11)
    55. tmp = ("lobby3" & tmp.Remove(0, 11))
    56. End If
    57. End If
    58. End If
    59. For Each c As Connection In list ' an alle clients weitersenden.
    60. Try
    61. If tmp.StartsWith("lobbyvoll") Then c.streamw.WriteLine(tmp)
    62. If tmp.StartsWith("lobby1") Then c.streamw.WriteLine(tmp)
    63. If tmp.StartsWith("lobby2") Then c.streamw.WriteLine(tmp)
    64. If tmp.StartsWith("lobby3") Then c.streamw.WriteLine(tmp)
    65. If tmp.StartsWith("spielstartet") Then c.streamw.WriteLine(tmp)
    66. If tmp.StartsWith("change") Then c.streamw.WriteLine(tmp)
    67. If tmp.StartsWith("ziel") Then c.streamw.WriteLine(tmp)
    68. If tmp.StartsWith("wand") Then c.streamw.WriteLine(tmp)
    69. c.streamw.Flush()
    70. Catch
    71. End Try
    72. Next
    73. Catch
    74. list.Remove(con)
    75. Exit Do
    76. End Try
    77. Loop
    78. End Sub
    79. End Module
    @Robin7 Wie es aussieht, habe ich denselben Code hier. Auch iwo im Forum gefunden. :/
    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!
    @Robin7 Dass ich es leider nicht nachvollziehen kann.
    Vielleicht orientierst Du Dich mal am Beispiel von Microsoft, da wird kein Modul, sondern eine Klasseninstanz verwendet.
    Gugst Du hier.
    Gugst Du hier.
    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!