Schleife wird ignoriert?

  • Allgemein

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy16823.

    Schleife wird ignoriert?

    Einen schönen Abend ersteinmal.

    Ich tüftele gerade an einem Chat.
    Dabei soll am Anfang die Kombination aus Username und Passwort geprüft werden.

    Übertragen wird dies vom Client per TCP mit USERNAME:PASSWORT.

    Der Server beinhaltet eine List(Of String) mit einem Beispielaccount gast123:abcde.

    Wenn der Client jetzt gestartet wird, soll im Server eine Überprüfung gestartet werden.

    Das geschieht so:

    VB.NET-Quellcode

    1. Dim nicklist As New List(Of String)
    2. Sub Main()
    3. nicklist.Add("gast123:abcde")
    4. For i As Integer = 0 To nicklist.Count Step 1
    5. If nicklist.ToString(i) = c.nick Then 'c.nick ist der eingegebene String
    6. 'AKTION
    7. End If
    8. Next
    9. End Sub()


    Leider klappt das nicht, und er macht einfach hinter dem Next weiter. Egal mit welchem Passwort oder Usernamen.

    Jetzt meine Frage; Könnt ihr mir helfen, dass Problem zu lösen?
    "Step 1" kannst du weglassen.
    Der Code von backtothetoast sollte das Problem lösen, wenn du den Index mit dem i angeben willst. Dann kann das "ToString" auch weg, denn der Eintrag ist ja ein String.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Was ist denn c? Ich wette das ist Nothing und nicht instanziiert. Diese Meldung zeigt, dass er wenigstens den Block ausführt.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich geb euch mal den Servercode:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Module Module1
    5. Private server As TcpListener
    6. Private client As New TcpClient
    7. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
    8. Private list As New List(Of Connection)
    9. Public nicklist As New List(Of String)
    10. Dim subnick As String
    11. Private Structure Connection
    12. Dim stream As NetworkStream
    13. Dim streamw As StreamWriter
    14. Dim streamr As StreamReader
    15. Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    16. End Structure
    17. Private Sub SendToAllClients(ByVal s As String)
    18. For Each c As Connection In list ' an alle clients weitersenden.
    19. Try
    20. c.streamw.WriteLine(s)
    21. c.streamw.Flush()
    22. Catch
    23. End Try
    24. Next
    25. End Sub
    26. Sub Main()
    27. ' Fabian
    28. nicklist.Add("radioffk:fabiankrahtz")
    29. ' END
    30. Console.WriteLine("InfoServer V 1 (c) radioffk - Status: Running")
    31. Console.WriteLine()
    32. Console.WriteLine("<==== IP ====>")
    33. Console.WriteLine(Dns.GetHostEntry(Dns.GetHostName()).AddressList.ToList().Find(Function(ip) ip.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork).ToString())
    34. Console.WriteLine("<============>")
    35. Console.WriteLine()
    36. server = New TcpListener(ipendpoint)
    37. server.Start()
    38. While True ' wir warten auf eine neue verbindung...
    39. client = server.AcceptTcpClient
    40. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    41. c.stream = client.GetStream
    42. c.streamr = New StreamReader(c.stream)
    43. c.streamw = New StreamWriter(c.stream)
    44. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    45. For i As Integer = 0 To nicklist.Count
    46. If nicklist(i) = c.nick Then
    47. SendToAllClients("@" & c.nick.Substring(0, subnick.Length) & " /success")
    48. End If
    49. Next
    50. subnick = c.nick.Split(":")(0).ToString()
    51. list.Add(c) ' und fügen sie der liste der clients hinzu.
    52. Console.WriteLine(c.nick.Substring(0, subnick.Length) & " has joined.")
    53. SendToAllClients(c.nick.Substring(0, subnick.Length) & " ist dem Chat beigetreten.")
    54. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
    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 ' warten, bis etwas empfangen wird...
    63. Dim bcast As String = tmp.Replace("/bcast ", "")
    64. If tmp = "/closeall" Then
    65. SendToAllClients("/close")
    66. End If
    67. If tmp.StartsWith("@") Then
    68. SendToAllClients(tmp)
    69. End If
    70. If tmp.StartsWith("/bcast") Then
    71. Console.WriteLine("[SERVER] Broadcast: " & bcast)
    72. SendToAllClients("[SERVER] Broadcast: " & bcast)
    73. ElseIf tmp = "/clsall" Then
    74. SendToAllClients("/cls")
    75. Else
    76. Console.WriteLine(con.nick.Substring(0, subnick.Length) & ": " & tmp)
    77. SendToAllClients(con.nick.Substring(0, subnick.Length) & " um " & TimeOfDay & ": " & tmp) ' an alle clients weitersenden.
    78. End If
    79. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    80. list.Remove(con)
    81. Console.WriteLine(con.nick.Substring(0, subnick.Length) & " has left.")
    82. SendToAllClients(con.nick.Substring(0, subnick.Length) & " hat den Chat verlassen.")
    83. Exit Do
    84. End Try
    85. Loop
    86. End Sub
    87. End Module
    Moin, so sollte es gehen oder

    VB.NET-Quellcode

    1. Dim nicklist As New List(Of String)
    2. Sub Main()
    3. nicklist.Add("gast123:abcde")
    4. For Each nick As String in nicklist
    5. If nick.Equals(c.nick) Then
    6. 'AKTION
    7. End If
    8. Next
    9. End Sub()
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Du addest einen Eintrag in die Liste, Count ist deshalb = 1, aber die Indexe fangen schon bei 0 an, folglich existiert Index 1 nicht.. Also musst du die Schleife bis Count -1 laufen lassen.

    VB.NET-Quellcode

    1. For i As Integer = 0 To nicklist.Count - 1
    2. Next
    Bist du Dir sicher, dass das überhaupt stimmt, denn sonst wäre die NullReferenceException wohl nicht gekommen...
    Zudem solltest du Andy's Code nehmen, For Each ist hier schlauer.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Was soll den in der Schleife im If Block gemacht werden ? wenn der String c.nick der gleicher wie der eintrag aus der liste ist, soll ein Code ausgeführt werden.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @Derfuhr Konsolentext:

    radioffk:fabian :::: radioffk:abcd

    Und er dürfte eigentlich nicht joinen und macht es trotzdem.

    @Andy16823 Er meldet dem Client per TCP dass er angemeldet ist.

    Edit: Er meldet jetzt nicht mehr an mit dem falschen Passwort, dafür kommt "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt" beim richtigen. :?: :?:

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

    ja dann mach ein Else If NOT nick.Equals(c.nick) Then rein, dann kannst du dort festlegen, was passiert wenn es nicht überein Stimmt.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Er meldet jetzt nicht mehr an mit dem falschen Passwort, dafür kommt "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt" beim richtigen. :?: :?:

    Habs jetzt so und es geht:

    VB.NET-Quellcode

    1. For Each nick As String In nicklist
    2. If nick.Equals(c.nick) = True Then
    3. subnick = c.nick.Split(":")(0).ToString()
    4. SendToAllClients("@" & c.nick.Substring(0, subnick.Length) & " /success")
    5. list.Add(c) ' und fügen sie der liste der clients hinzu.
    6. Console.WriteLine(c.nick.Substring(1, subnick.Length) & " has joined.")
    7. SendToAllClients(c.nick.Substring(1, subnick.Length) & " ist dem Chat beigetreten.")
    8. End If
    9. Next


    dafür registriert er nach dem Joinen eines 2 Users den 1 nicht mehr. Der 1 kann dann nicht mehr schreiben. Weiß da jemand was?