TCP Chat Problem mit den Namen

  • Allgemein

    TCP Chat Problem mit den Namen

    Hallo alle zusammen.

    Ich habe leider ein kleines Problem.
    Ich hab nach dieser Anleitung [VB.NET] Multiserver (TCP) einen Multiserver und verschiedene Clients programmiert.
    Das Grundsystem läuft. Also Server usw. das Problem was ich habe ist, dass er wenn zwei Leute on sind, den ersten "bevorzugt". Also egal von welchem Client man Text sendet, er kommt immer mit der Angabe, er wäre vom ersten gesendet, an.
    Das ist mein Programm mit auftretendem Fehler: (Links wird Hallo gesendet aber er behauptet es wäre von rechts gesendet worden)


    Das ist mein Sourcecode:
    Server:

    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)
    8. Private list As New List(Of Connection)
    9. Private Structure Connection
    10. Dim stream As NetworkStream
    11. Dim streamw As StreamWriter
    12. Dim streamr As StreamReader
    13. Dim nick As String
    14. End Structure
    15. Private Sub SendToAllClients(ByVal s As String)
    16. For Each c As Connection In list
    17. Try
    18. c.streamw.WriteLine(s)
    19. c.streamw.Flush()
    20. Catch
    21. End Try
    22. Next
    23. End Sub
    24. Sub Main()
    25. Console.WriteLine("Server is running")
    26. server = New TcpListener(ipendpoint)
    27. server.Start()
    28. While True
    29. client = server.AcceptTcpClient
    30. Dim c As New Connection
    31. c.stream = client.GetStream
    32. c.streamr = New StreamReader(c.stream)
    33. c.streamw = New StreamWriter(c.stream)
    34. c.nick = c.streamr.ReadLine
    35. list.Add(c)
    36. Console.WriteLine(c.nick & " has joined.")
    37. SendToAllClients(c.nick & " ist dem Chat beigetreten.")
    38. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    39. t.Start(c)
    40. End While
    41. End Sub
    42. Private Sub ListenToConnection(ByVal con As Connection)
    43. Do
    44. Try
    45. Dim tmp As String = con.streamr.ReadLine
    46. Dim kickUser As String = tmp.Replace("/kick ", "")
    47. For Each con In list
    48. If con.nick = kickUser Then
    49. con.streamw.Write("Du wurdest gekickt.")
    50. con.streamw.Flush()
    51. list.Remove(con)
    52. End If
    53. Next
    54. Dim muteUser As String = tmp.Replace("/mute ", "")
    55. For Each con In list
    56. If con.nick = muteUser Then
    57. con.streamw.Write("Du wurdest gemutet.")
    58. con.streamw.Flush()
    59. list.Remove(con)
    60. End If
    61. Next
    62. Dim bcast As String = tmp.Replace("/bcast ", "")
    63. If tmp = "/closeall" Then
    64. SendToAllClients("/close")
    65. End If
    66. If tmp.StartsWith("/bcast") Then
    67. Console.WriteLine("[SERVER] Broadcast: " & bcast)
    68. SendToAllClients("[SERVER] Broadcast: " & bcast)
    69. ElseIf tmp = "/clsall" Then
    70. SendToAllClients("/cls")
    71. Else
    72. Console.WriteLine(con.nick & ": " & tmp)
    73. SendToAllClients(con.nick & " um " & TimeOfDay & ": " & tmp)
    74. End If
    75. Catch
    76. list.Remove(con)
    77. Console.WriteLine(con.nick & " has left.")
    78. SendToAllClients(con.nick & " hat den Chat verlassen.")
    79. Exit Do
    80. End Try
    81. Loop
    82. End Sub
    83. End Module

    Client:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Dim ip As String
    5. Private stream As NetworkStream
    6. Private streamw As StreamWriter
    7. Private streamr As StreamReader
    8. Private client As New TcpClient
    9. Private t As New Threading.Thread(AddressOf Listen)
    10. Private Delegate Sub DAddItem(ByVal s As String)
    11. Private nick As String = "[ADMIN] radio-ffk"
    12. Private Sub AddItem(ByVal s As String)
    13. If s.Contains("[ADMIN] radio-ffk") Then
    14. RichTextBox1.SelectionColor = Color.Green
    15. RichTextBox1.AppendText(s & vbNewLine)
    16. ElseIf s.Contains("[CO-ADMIN] Tiippexx") Then
    17. RichTextBox1.SelectionColor = Color.LimeGreen
    18. RichTextBox1.AppendText(s & vbNewLine)
    19. ElseIf s.Contains("[SERVER] Broadcast") Then
    20. RichTextBox1.SelectionColor = Color.RoyalBlue
    21. RichTextBox1.AppendText(s & vbNewLine)
    22. Else
    23. RichTextBox1.SelectionColor = Color.Black
    24. RichTextBox1.AppendText(s & vbNewLine)
    25. End If
    26. If s = "/close" Then
    27. Application.Exit()
    28. End If
    29. If s = "/cls" Then
    30. RichTextBox1.Text = ""
    31. RichTextBox1.SelectionColor = Color.RoyalBlue
    32. RichTextBox1.AppendText("[SERVER] Der Chat wurde geleert" & vbNewLine)
    33. End If
    34. RichTextBox1.SelectionColor = Color.Black
    35. End Sub
    36. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    37. ip = InputBox("IP?", "")
    38. End Sub
    39. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    40. Try
    41. client.Connect(ip, 8000) ' hier die ip des servers eintragen.
    42. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    43. If client.Connected Then
    44. stream = client.GetStream
    45. streamw = New StreamWriter(stream)
    46. streamr = New StreamReader(stream)
    47. streamw.WriteLine(nick)
    48. streamw.Flush()
    49. t.Start()
    50. Else
    51. Application.Exit()
    52. End If
    53. Catch ex As Exception
    54. Application.Exit()
    55. End Try
    56. End Sub
    57. Private Sub Listen()
    58. While client.Connected
    59. Try
    60. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    61. Catch
    62. Application.Exit()
    63. End Try
    64. End While
    65. End Sub
    66. Private Sub MetroButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MetroButton1.Click
    67. streamw.WriteLine(TextBox1.Text)
    68. streamw.Flush()
    69. TextBox1.Clear()
    70. End Sub
    71. Private Sub MetroButton2_Click(sender As Object, e As EventArgs) Handles MetroButton2.Click
    72. streamw.WriteLine("/kick " & TextBox2.Text)
    73. streamw.Flush()
    74. TextBox2.Clear()
    75. End Sub
    76. Private Sub MetroButton3_Click(sender As Object, e As EventArgs) Handles MetroButton3.Click
    77. streamw.WriteLine("/mute " & TextBox3.Text)
    78. streamw.Flush()
    79. TextBox3.Clear()
    80. End Sub
    81. Private Sub MetroButton4_Click(sender As Object, e As EventArgs) Handles MetroButton4.Click
    82. streamw.WriteLine("/bcast " & TextBox4.Text)
    83. streamw.Flush()
    84. TextBox4.Clear()
    85. End Sub
    86. Private Sub MetroButton5_Click(sender As Object, e As EventArgs) Handles MetroButton5.Click
    87. streamw.WriteLine("/closeall")
    88. streamw.Flush()
    89. End Sub
    90. Private Sub MetroButton6_Click(sender As Object, e As EventArgs) Handles MetroButton6.Click
    91. streamw.WriteLine("/clsall")
    92. streamw.Flush()
    93. End Sub
    94. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    95. If TextBox2.Text = "" Then
    96. MetroButton2.Enabled = False
    97. Else
    98. MetroButton2.Enabled = True
    99. End If
    100. If TextBox3.Text = "" Then
    101. MetroButton3.Enabled = False
    102. Else
    103. MetroButton3.Enabled = True
    104. End If
    105. If TextBox4.Text = "" Then
    106. MetroButton4.Enabled = False
    107. Else
    108. MetroButton4.Enabled = True
    109. End If
    110. End Sub
    111. Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    112. If e.KeyCode = Keys.Enter Then
    113. streamw.WriteLine(TextBox1.Text)
    114. streamw.Flush()
    115. TextBox1.Clear()
    116. End If
    117. End Sub
    118. Private Sub TextBox2_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox2.KeyDown
    119. If e.KeyCode = Keys.Enter Then
    120. streamw.WriteLine("/kick " & TextBox2.Text)
    121. streamw.Flush()
    122. TextBox2.Clear()
    123. End If
    124. End Sub
    125. Private Sub TextBox3_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox3.KeyDown
    126. If e.KeyCode = Keys.Enter Then
    127. streamw.WriteLine("/mute " & TextBox3.Text)
    128. streamw.Flush()
    129. TextBox3.Clear()
    130. End If
    131. End Sub
    132. Private Sub TextBox4_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox4.KeyDown
    133. If e.KeyCode = Keys.Enter Then
    134. streamw.WriteLine("/bcast " & TextBox4.Text)
    135. streamw.Flush()
    136. TextBox4.Clear()
    137. End If
    138. End Sub
    139. End Class


    Befehle gehen dann vom zweiten User im übrigen garnicht mehr.
    Bin über jede Hilfe dankbar.

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