Chat probleme.. D:

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Chat probleme.. D:

    Ich habe mir ein Chat Client/Server Code abgeschrieben und wenig verändert.
    Ich komme irgendwie nicht richtig klar ich will, wenn einer sich anmeldet das die Chatnachricht dick gedruckt ist.
    Habe da schon was zusammen aber das geht nicht.. x.x
    Dann hab ich noch das Problem das der Chat nicht automatisch runterscrollt das was ich versucht habe geht alles nicht oder es hackt.
    Desweiteren is die Onlineanzeige doof. Es geht zwa alles, aber wenn ein Client off geht dann kommt die nachricht das er Off gegangen ist aber er wird nicht aus der Onlineliste gelöscht.

    Hier der Code von Client und Server:
    Spoiler anzeigen

    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, 80) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
    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 ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    14. End Structure
    15. Private Sub SendToAllClients(ByVal s As String)
    16. For Each c As Connection In list ' an alle clients weitersenden.
    17. Try
    18. c.streamw.WriteLine(s)
    19. c.streamw.Flush()
    20. Catch
    21. End Try
    22. Next
    23. End Sub
    24. Public Sub Userlist()
    25. Dim users As String = ""
    26. For Each Connections In list
    27. users = users & Connections.nick.ToString & ","
    28. SendToAllClients("/u " & users)
    29. Next
    30. End Sub
    31. Sub Main()
    32. Console.WriteLine("Der Server läuft!")
    33. server = New TcpListener(ipendpoint)
    34. server.Start()
    35. While True ' wir warten auf eine neue verbindung...
    36. client = server.AcceptTcpClient
    37. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    38. c.stream = client.GetStream
    39. c.streamr = New StreamReader(c.stream)
    40. c.streamw = New StreamWriter(c.stream)
    41. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    42. list.Add(c) ' und fügen sie der liste der clients hinzu.
    43. Userlist()
    44. Console.WriteLine(c.nick & " has joined.")
    45. SendToAllClients("--> " & "s§" & c.nick & "§" & " hat den Chat verlassen.")
    46. 'SendToAllClients("--> " & c.nick & " hat den Chat betreten.")
    47. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten.
    48. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    49. t.Start(c)
    50. End While
    51. End Sub
    52. Private Sub Sendtoperson(ByVal s As String, ByVal Nick As String)
    53. For Each Connection In list
    54. Try
    55. If Connection.nick = Nick Then
    56. Connection.streamw.WriteLine(s)
    57. Connection.streamw.Flush()
    58. End If
    59. Catch
    60. End Try
    61. Next
    62. End Sub
    63. Private Sub ListenToConnection(ByVal con As Connection)
    64. Do
    65. Try
    66. Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
    67. Console.WriteLine("S_" + con.nick & ": " & tmp)
    68. For Each c As Connection In list ' an alle clients weitersenden.
    69. Try
    70. c.streamw.WriteLine(con.nick & ": " & tmp)
    71. c.streamw.Flush()
    72. Catch
    73. End Try
    74. Next
    75. If tmp.StartsWith("/kick") Then
    76. Dim Kickname As String = tmp.Remove(0, 6)
    77. For Each Connection In list
    78. If Connection.nick = Kickname Then
    79. SendToAllClients("--> " & Kickname & " wurde gekickt.")
    80. Sendtoperson("--> " + Kickname + " wurde gekickt.", Kickname)
    81. Console.WriteLine(Kickname & " has kicked!")
    82. list.Remove(Connection)
    83. Exit For
    84. End If
    85. Next
    86. End If
    87. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    88. list.Remove(con)
    89. Console.WriteLine(con.nick & " has exit.")
    90. SendToAllClients("--> " & "s§" & con.nick & "§" & " hat den Chat verlassen.")
    91. Exit Do
    92. End Try
    93. Loop
    94. End Sub
    95. End Module


    Client:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Private stream As NetworkStream
    5. Private streamw As StreamWriter
    6. Private streamr As StreamReader
    7. Private client As New TcpClient
    8. Private t As New Threading.Thread(AddressOf Listen)
    9. Private Delegate Sub DAddItem(ByVal s As String)
    10. Private nick As String = "unknown"
    11. Public Sub AddItem(ByVal s As String)
    12. Dim chat As String() = s.Split(New Char() {"§"c})
    13. Select Case chat(0)
    14. Case "s"
    15. RichTextBox1.SelectionFont = New Font(RichTextBox1.Font, FontStyle.Bold)
    16. RichTextBox1.SelectionColor = RichTextBox1.ForeColor
    17. RichTextBox1.AppendText(chat(1) & ": ")
    18. RichTextBox1.SelectionFont = New Font(RichTextBox1.Font, FontStyle.Regular)
    19. RichTextBox1.AppendText(chat(2) & vbCrLf)
    20. End Select
    21. Dim userlist As String()
    22. If s.StartsWith("/u ") Then
    23. userlist = s.Remove(0, 3).Split(",")
    24. ListBox2.Items.Clear()
    25. ListBox2.Items.AddRange(userlist)
    26. Else
    27. RichTextBox1.Text = RichTextBox1.Text & s & vbCrLf
    28. End If
    29. If s.StartsWith("--> " + nick + " wurde gekickt.") Then
    30. client.Close()
    31. stream.Close()
    32. streamr.Close()
    33. streamw.Close()
    34. MsgBox("Du wurdest gekickt.")
    35. Application.Exit()
    36. End If
    37. End Sub
    38. Private ActiveConnection As Boolean = True
    39. Private Sub Listen()
    40. While client.Connected And ActiveConnection
    41. Try
    42. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    43. Catch
    44. If ActiveConnection Then ' Abfrage
    45. 'MessageBox.Show("Keine Verbindung zum Server." & vbNewLine & "Das Programm wird nun beendet.")
    46. End If
    47. CloseConnection()
    48. End Try
    49. End While
    50. End Sub
    51. Public Sub CloseConnection()
    52. ActiveConnection = False
    53. streamw.Close()
    54. streamr.Close()
    55. stream.Close()
    56. client.Close()
    57. End Sub
    58. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    59. If TextBox1.Text = "" Then
    60. Else
    61. streamw.WriteLine(TextBox1.Text)
    62. streamw.Flush()
    63. TextBox1.Clear()
    64. End If
    65. End Sub
    66. Private Sub Form1_leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
    67. End
    68. End Sub
    69. Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
    70. TextBox1.Text = "/w " + ListBox2.Text
    71. End Sub
    72. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    73. Dim IP As String = TextBox4.Text
    74. Dim PORT As String = TextBox2.Text
    75. nick = TextBox3.Text
    76. TextBox1.ReadOnly = False
    77. TextBox2.ReadOnly = True
    78. TextBox3.ReadOnly = True
    79. TextBox4.ReadOnly = True
    80. Try
    81. client.Connect(IP, PORT) ' hier die ip des servers eintragen.
    82. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    83. If client.Connected Then
    84. stream = client.GetStream
    85. streamw = New StreamWriter(stream)
    86. streamr = New StreamReader(stream)
    87. streamw.WriteLine(nick) ' das ist optional.
    88. streamw.Flush()
    89. t.Start()
    90. Button3.Visible = False
    91. Button1.Visible = True
    92. ToolStripStatusLabel1.Text = "Verbunden? Ja."
    93. Else
    94. MessageBox.Show("Verbindung zum Server nicht möglich!")
    95. Application.Exit()
    96. End If
    97. Catch ex As Exception
    98. MessageBox.Show("Verbindung zum Server nicht möglich!")
    99. Application.Exit()
    100. End Try
    101. End Sub
    102. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    103. End
    104. End Sub
    105. End Class

    Dein "Chat" löst momentan nur ganz grundlegend die Anforderung der Kommunikations-Verbindung - weiter kann der noch nix.

    Ein Chat wie du ihn dir vorstellst, mit registrierten Benutzern, die wiedererkannt werden, und deren Name fettgedruckt wird, ist eine viel kompliziertere Sache, da muß man ein Datenmodell konzipieren, damit man User registrieren, ändern, löschen kann, sowie einloggen und ausloggen.
    Vlt. willst du ja auch ChatRooms implementieren, da muss man nochmal ordentlich Hirnschmalz investieren.
    Das ist eine ganze Datenverarbeitung - mit Code abschreiben und ändern wird man da nicht durchkommen.

    Weiters muß ein KommunikationsProtokoll definiert und implementiert werden, damit eine klare Struktur besteht, wie Nachrichten gesendet werden, und was Server/Client jeweils damit anfangen.
    Bisher gibts bei dir ja nur eine Art von Nachricht, nämlich "Mitteilung an alle".
    In einem richtigen Chat ergeben sich aber viele ganz unterschiedliche Arten von Nachrichten: LogIn, LogOut, Registrierung, ChatRoom-Enter/-Exit, DateiÜbertragung? - die eigliche Mitteilung in einen ChatRoom ist nur eine Nachrichten-Art von vielen.
    Die Nachrichten müssen also iwie eindeutig gekennzeichnet sein, damit der Server richtig reagieren kann, vmtl. gibts einen richtigen kleinen Befehls-Satz - halt ein KommunikationsProtokoll.