Hi,
ich schreibe ein Chatprogramm für das Pain and Paper Spiel DSA, dazu benutze ich einen TCP Listener und TCP Client, und ich bin gerade bei dem Client.
Für die Kommunikation schreibe ich ein kleines Protokoll, bisher kann es nur registrieren und anmelden, doch jedes Mal, wenn der Client vom Server die Nachricht erhält, dass die Registration bzw. der LogIn erfolgreich war, sollte die Registrationsform geschlossen bzw. die Login form unsichtbar gemacht werden und eine ChatRoom form auftauchen. Das passier auch, doch die Registrations form bzw. LogIn form bleibt da und reagiert weiterhin, die ChatRoom from taucht auf ist aber "Keine Rückmeldung".
Ich habe schon alles ausprobiert, aber ich kriege einfach nicht heraus, worand das liegt und komme deshalb auch nicht drauf, wie man es beheben kann.
Hier ist der Quellcode:
User Klasse
Spoiler anzeigen
Client Klasse
Spoiler anzeigen
Filter Klasse
Spoiler anzeigen
Enums
Ich kann bei Bedarf die ganze Projectmappe hochladen und hier den Link posten.
ich schreibe ein Chatprogramm für das Pain and Paper Spiel DSA, dazu benutze ich einen TCP Listener und TCP Client, und ich bin gerade bei dem Client.
Für die Kommunikation schreibe ich ein kleines Protokoll, bisher kann es nur registrieren und anmelden, doch jedes Mal, wenn der Client vom Server die Nachricht erhält, dass die Registration bzw. der LogIn erfolgreich war, sollte die Registrationsform geschlossen bzw. die Login form unsichtbar gemacht werden und eine ChatRoom form auftauchen. Das passier auch, doch die Registrations form bzw. LogIn form bleibt da und reagiert weiterhin, die ChatRoom from taucht auf ist aber "Keine Rückmeldung".
Ich habe schon alles ausprobiert, aber ich kriege einfach nicht heraus, worand das liegt und komme deshalb auch nicht drauf, wie man es beheben kann.
Hier ist der Quellcode:
User Klasse
VB.NET-Quellcode
- Public Class User
- Class Account
- Public Shared Property Username As String = Nothing
- Public Shared Property Password As String = Nothing
- Public Shared Property EMail As String = Nothing
- Public Shared Property ID As UInteger = Nothing
- End Class
- Class Chat
- Public Shared Property ChatView As String
- Public Shared Property Users As New ListBox
- End Class
- Class Control
- Private Shared ACL As New List(Of String)
- Public Shared Sub AddAllowedChars()
- With ACL
- .Add("A")
- 'Die Liste ist länger, habe die nur entfernt, damit es nicht si viele Zeichen sind.
- .Add("@")
- End With
- End Sub
- Public Shared Function CheckAccInfoIsOk(ByVal AccInfo As String) As Boolean
- Dim Chr As Char() = AccInfo.ToCharArray
- For i As Byte = 0 To UBound(Chr)
- For Each aChr As String In ACL
- If Chr(i) = aChr Then
- Exit For
- ElseIf aChr = "@" Then
- Return False
- End If
- Next
- Next
- Return True
- End Function
- Public Shared Sub LogIn(ByVal Username As String, ByVal Password As String)
- AddAllowedChars()
- If Username.Length < 3 Then
- MsgBox("Der Benutzername ist zu kurz!" & ControlChars.CrLf & _
- "Es sind mindestens 3 und maximum 12 Zeichen erlaubt!", MsgBoxStyle.Critical, "Zu kurzer Benutzername")
- Exit Sub
- End If
- If Password.Length < 6 Then
- MsgBox("Das Kennwort ist zu kurz!" & ControlChars.CrLf & _
- "Es sind mindestens 6 und maximum 24 Zeichen erlaubt!", MsgBoxStyle.Critical, "Zu kurzes Kennwort")
- Exit Sub
- End If
- If CheckAccInfoIsOk(Username) = False Then
- MsgBox("Der Benutzername enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotener Benutzername")
- Exit Sub
- ElseIf Username.Contains("@") Or Username.Contains(".") Then
- MsgBox("Der Benutzername enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotener Benutzername")
- Exit Sub
- End If
- If CheckAccInfoIsOk(Password) = False Then
- MsgBox("Das Kennwort enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotenes Kennwort")
- Exit Sub
- ElseIf Password.Contains("@") Or Password.Contains(".") Then
- MsgBox("Das Kennwort enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotenes Kennwort")
- Exit Sub
- End If
- If Client.Connected = False Then
- Client.Connect(IP, Port)
- End If
- Dim Command As String = "CltLogin:<" & Username & ">[" & Password & "]"
- Client.SendMessage(Command)
- End Sub
- Public Shared Sub Registry(ByVal Username As String, ByVal Password As String, ByVal cPassword As String, ByVal EMail As String, ByVal cEmail As String)
- AddAllowedChars()
- If Username.Length < 3 Then
- MsgBox("Der Benutzername ist zu kurz!" & ControlChars.CrLf & _
- "Es sind mindestens 3 und maximum 12 Zeichen erlaubt!", MsgBoxStyle.Critical, "Zu kurzer Benutzername")
- Exit Sub
- End If
- If Password.Length < 6 Then
- MsgBox("Das Kennwort ist zu kurz!" & ControlChars.CrLf & _
- "Es sind mindestens 6 und maximum 24 Zeichen erlaubt!", MsgBoxStyle.Critical, "Zu kurzes Kennwort")
- Exit Sub
- End If
- If Not EMail.Contains("@") Or Not EMail.Contains(".") Then
- MsgBox("Die E-Mail Adresse ist unvolstendig!", MsgBoxStyle.Critical, "Ungültige E-Mail Adresse")
- Exit Sub
- End If
- If CheckAccInfoIsOk(Username) = False Then
- MsgBox("Der Benutzername enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotener Benutzername")
- Exit Sub
- ElseIf Username.Contains("@") Or Username.Contains(".") Then
- MsgBox("Der Benutzername enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotener Benutzername")
- Exit Sub
- End If
- If CheckAccInfoIsOk(Password) = False Then
- MsgBox("Das Kennwort enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotenes Kennwort")
- Exit Sub
- ElseIf Password.Contains("@") Or Password.Contains(".") Then
- MsgBox("Das Kennwort enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Verbotenes Kennwort")
- Exit Sub
- End If
- If CheckAccInfoIsOk(EMail) = False Then
- MsgBox("Die E-Mail Adresse enthält verbotene Zeichen." & ControlChars.CrLf & _
- "Es sind nur A-Z, a-z, 0-9 und _ erlaubt!", MsgBoxStyle.Critical, "Ungültige E-Mail")
- Exit Sub
- End If
- If Not Password = cPassword Then
- MsgBox("Die Kennwörter stimmen nicht überein!", MsgBoxStyle.Critical, "Unterschiedliche Kennwörter")
- Exit Sub
- End If
- If Not EMail = cEmail Then
- MsgBox("Die E-Mail Adressen stimmen nicht überein!", MsgBoxStyle.Critical, "Unterschiedliche E-Mail's")
- Exit Sub
- End If
- If Client.Connected = False Then
- Client.Connect(IP, Port)
- End If
- Dim Command As String = "CltRegistration:<" & Username & ">[" & Password & "]{" & EMail & "}"
- Client.SendMessage(Command)
- End Sub
- Public Shared Sub SendMessage(ByRef MessageInput As RichTextBox)
- Dim Message As String = User.Account.Username & ": " & MessageInput.Text
- MessageInput.SelectAll()
- MessageInput.Cut()
- Client.SendMessage(Message)
- End Sub
- End Class
- End Class
Client Klasse
VB.NET-Quellcode
- Imports System.IO
- Imports System.Net
- Imports System.Threading
- Imports System.Net.Sockets
- Public Class Client
- Private Shared clt As New TcpClient
- Private Shared stream As NetworkStream
- Private Shared stream_w As StreamWriter
- Private Shared stream_r As StreamReader
- Private Shared Listener As Thread
- Public Shared Property Connected As Boolean = False
- Private Shared Sub _reciver()
- While True
- Try
- Dim msg As String = stream_r.ReadLine
- DoCommand(msg)
- Catch ex As Exception
- DoCommand("Svr$disconnected$")
- End Try
- End While
- End Sub
- Public Shared Function Connect(ByVal IP As String, ByVal Port As Integer) As Boolean
- On Error GoTo fehler
- clt.Connect(IP, Port)
- Do Until clt.Connected
- Application.DoEvents()
- Loop
- stream = clt.GetStream
- stream_w = New StreamWriter(stream)
- stream_r = New StreamReader(stream)
- Listener = New Thread(AddressOf _reciver)
- Listener.IsBackground = True
- Listener.Start()
- Connected = clt.Connected
- Return True
- fehler:
- Connected = clt.Connected
- Return False
- End Function
- Public Shared Sub Disconnect()
- Dim msg As String = "CltDC:" & "#" & User.Account.ID & "$"
- SendMessage(msg)
- clt.Close()
- Connected = clt.Connected
- End Sub
- Public Shared Sub SendMessage(ByVal Message As String)
- Try
- stream_w.WriteLine(Message)
- stream_w.Flush()
- Catch ex As Exception
- DoCommand("Svr$disconnected$")
- End Try
- End Sub
- Private Shared Sub DoCommand(ByVal msg As String)
- If msg = "Svr$disconnected$" Then
- MsgBox("Verbindung zum Server verloren!" & ControlChars.CrLf & _
- "Das Progtamm wird geschloßen!", MsgBoxStyle.Critical, "Fehler")
- Application.Exit()
- ElseIf msg.StartsWith("SvrLogin:") Then
- Dim Answer As SByte = Filter.GetAnswerID(msg)
- If Answer = Login.Complete Then
- User.Account.Username = Filter.GetUsername(msg)
- User.Account.Password = Filter.GetPassword(msg)
- User.Account.EMail = Filter.GetEMail(msg)
- User.Account.ID = Filter.GetID(msg)
- ChatRoom.Show()
- MsgBox("Anmeldung erfolgreich!", MsgBoxStyle.Information, "Angemeldet")
- ElseIf Answer = Login.UserNotFound Then
- MsgBox("Dieser Benutzername exestiert nicht!", MsgBoxStyle.Critical, "Falscher Benutzername")
- ElseIf Answer = Login.IncorrectPassword Then
- MsgBox("Das Kennwort ist falsch!", MsgBoxStyle.Critical, "Falsches Kennwort")
- ElseIf Answer = Login.UserIsBanned Then
- MsgBox("Dieser Benutzername ist gebannt!", MsgBoxStyle.Critical, "Benutzername gebannt")
- End If
- ElseIf msg.StartsWith("SvrRegistration:") Then
- Dim Answer As SByte = Filter.GetAnswerID(msg)
- If Answer = Registration.Complete Then
- MsgBox("Die Registration war erfolgreich!", MsgBoxStyle.Information, "Registration abgeschlossen")
- User.Account.Username = Filter.GetUsername(msg)
- User.Account.Password = Filter.GetPassword(msg)
- User.Account.EMail = Filter.GetEMail(msg)
- User.Account.ID = Filter.GetID(msg)
- msg = ""
- ChatRoom.Show()
- frmRegistrations.Close()
- ElseIf Answer = Registration.UserExists Then
- MsgBox("Der gewählte Benutzername exestiert bereits!", MsgBoxStyle.Critical, "Benutzername vergeben")
- End If
- End If
- End Sub
- End Class
Filter Klasse
VB.NET-Quellcode
- Public Class Filter
- Public Shared Sub SelectTextRegion(ByVal rtf As RichTextBox, ByVal FirstChar As String, ByVal SecondChar As String)
- Dim FindFirstPosition As Integer = rtf.Text.IndexOf(FirstChar, _
- rtf.SelectionStart + rtf.SelectionLength)
- If FindFirstPosition = -1 Then
- FindFirstPosition = rtf.Text.IndexOf(FirstChar)
- End If
- If FindFirstPosition <> -1 Then
- Dim FindSecondPosition As Integer = rtf.Text.IndexOf(SecondChar, _
- FindFirstPosition)
- If FindSecondPosition <> -1 Then
- rtf.SelectionStart = FindFirstPosition
- rtf.SelectionLength = (FindSecondPosition - FindFirstPosition) + 1
- rtf.Focus()
- End If
- End If
- End Sub
- Public Shared Function GetUsername(ByVal RequestLine As String) As String
- Dim rtb As New RichTextBox With {.Text = RequestLine}
- Call SelectTextRegion(rtb, "<", ">")
- rtb.Cut()
- rtb.SelectAll()
- rtb.Paste()
- Dim line As String = rtb.Text
- line = line.Remove(0, 1)
- Return line.Remove(line.Length - 1, 1)
- End Function
- Public Shared Function GetPassword(ByVal RequestLine As String) As String
- Dim rtb As New RichTextBox With {.Text = RequestLine}
- Call SelectTextRegion(rtb, "[", "]")
- rtb.Cut()
- rtb.SelectAll()
- rtb.Paste()
- Dim line As String = rtb.Text
- line = line.Remove(0, 1)
- Return line.Remove(line.Length - 1, 1)
- End Function
- Public Shared Function GetEMail(ByVal RequestLine As String) As String
- Dim rtb As New RichTextBox With {.Text = RequestLine}
- Call SelectTextRegion(rtb, "{", "}")
- rtb.Cut()
- rtb.SelectAll()
- rtb.Paste()
- Dim line As String = rtb.Text
- line = line.Remove(0, 1)
- Return line.Remove(line.Length - 1, 1)
- End Function
- Public Shared Function GetAnswerID(ByVal msg As String) As SByte
- Dim rtb As New RichTextBox With {.Text = msg}
- Call SelectTextRegion(rtb, "`", "´")
- rtb.Cut()
- rtb.SelectAll()
- rtb.Paste()
- Dim line As String = rtb.Text
- line = line.Remove(0, 1)
- Return line.Remove(line.Length - 1, 1)
- End Function
- Public Shared Function GetID(ByVal msg As String) As UInteger
- Dim rtb As New RichTextBox With {.Text = msg}
- Call SelectTextRegion(rtb, "#", "$")
- rtb.Cut()
- rtb.SelectAll()
- rtb.Paste()
- Dim line As String = rtb.Text
- line = line.Remove(0, 1)
- Return line.Remove(line.Length - 1, 1)
- End Function
- End Class
Enums
Ich kann bei Bedarf die ganze Projectmappe hochladen und hier den Link posten.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ViktorS“ ()