vb 2015 - Chat mit UTicket.dll

  • VB.NET

Es gibt 73 Antworten in diesem Thema. Der letzte Beitrag () ist von Thiemo1991.

    vb 2015 - Chat mit UTicket.dll

    Hallo ihr lieben,

    ich habe es dennoch geschafft, einen Chat und Server zu programmieren aber jetzt wäre es hilfreich wenn der User dem geschrieben wird, auch sieht dass der eine gerade etwas eingibt. Wie kann man sowas machen?

    MFG
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    So wie beim Chat selbst auch. Anstatt Strings zu schicken, schickst du halt irgendwas, was signalisiert, dass der Benutzer tippt.
    Die konkrete Implementation hängt davon ab, wie du selbst dein Chatsystem realisiert hast. Wenn du einfach nur Buchstaben schickst, musst du wohl eine Ausnahme einführen, die das Tippen vom Rest unterscheidet. Wenn du hingegen auch Metadaten verschickst, kannst du das recht einfach einfügen. Beschreib' am besten einfach dein System mal.

    Viele Grüße
    ~blaze~
    Ich habe zwar den Chat nicht ganz alleine gemacht (das ist von einem der auch hier im Forum war/ist, eine Vorlage), aber die darf man sogar verwenden. Und da dazu möchte ich halt auch noch eigene Sachen rein bringen wie z.B. die Animation wenn der andere User etwas schreibt usw.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Ich gebe dir bzw. euch mal den Code.

    VB.NET-Quellcode

    1. ​Imports UniversalTicket
    2. Public Class tmChat
    3. Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Integer
    4. Private WithEvents utc As UTicketClient
    5. Private Sub frmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    6. guiZustandGetrennt()
    7. verbindungTrennen()
    8. End Sub
    9. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. BenutzernamenVorschlag()
    11. guiZustandGetrennt()
    12. End Sub
    13. Private Sub BenutzernamenVorschlag()
    14. Dim sUsernameSplit() As String = Split(My.User.Name, "\")
    15. txtUsername.Text = sUsernameSplit(UBound(sUsernameSplit))
    16. End Sub
    17. Private Sub guiZustandGetrennt()
    18. rtbChatAusgabe.Text = ""
    19. txtChatEingabe.Text = ""
    20. txtUsername.Enabled = True
    21. grpVerbindung.Enabled = True
    22. picVerbindungsstatus.BackColor = Color.FromKnownColor(KnownColor.Control)
    23. End Sub
    24. Private Sub guiZustandVerbinungSteht()
    25. txtUsername.Enabled = False
    26. grpVerbindung.Visible = False
    27. picVerbindungsstatus.BackColor = Color.Green
    28. txtChatEingabe.Focus()
    29. End Sub
    30. Private Sub utc_ConnectionLost(sReason As String) Handles utc.ConnectionLost
    31. guiZustandGetrennt()
    32. MsgBox("Verbindung wurde getrennt!" & vbNewLine & vbNewLine & sReason, MsgBoxStyle.Exclamation)
    33. End Sub
    34. Private Sub utc_ConnectionNotPossible(sReason As String) Handles utc.ConnectionNotPossible
    35. guiZustandGetrennt()
    36. MsgBox("Verbindung konnte nicht hergestellt werden!" & vbNewLine & vbNewLine & sReason, MsgBoxStyle.Exclamation)
    37. End Sub
    38. Private Sub verbindungSteht() Handles utc.ConnectionReadyForSending
    39. guiZustandVerbinungSteht()
    40. End Sub
    41. Private Sub guiZustandVerbindungHerstellen()
    42. guiZustandGetrennt()
    43. grpVerbindung.Enabled = False
    44. Application.DoEvents()
    45. End Sub
    46. Private Sub verbindungHerstellen()
    47. utc = New UTicketClient("", 78, "3290fja39j%§(§&_SERVER-PASSWORD_§=JDf9", Me)
    48. If utc.isServerAvailable = True Then
    49. utc.start(txtUsername.Text)
    50. Else
    51. MsgBox("Der Server ist leider gerade offline!", MsgBoxStyle.Exclamation)
    52. guiZustandGetrennt()
    53. End If
    54. End Sub
    55. Private Sub verbindungTrennen()
    56. If utc IsNot Nothing Then
    57. utc.shutdown()
    58. End If
    59. End Sub
    60. Private Sub utc_IDalreadyInUseConnectionAborted() Handles utc.IDalreadyInUseConnectionAborted
    61. guiZustandGetrennt()
    62. MsgBox("Diese ID ist leider bereits vergeben!", MsgBoxStyle.Exclamation)
    63. End Sub
    64. Private Sub utc_IDisGone(sID As String) Handles utc.IDisGone
    65. rtbChatAusgabe.AppendText("[" & getUhrZeit() & "] " & sID & " hat den Server verlassen!" & vbNewLine)
    66. End Sub
    67. Private Sub utc_IDjoined(sID As String) Handles utc.IDjoined
    68. rtbChatAusgabe.AppendText("[" & getUhrZeit() & "] " & sID & " hat den Server betreten!" & vbNewLine)
    69. End Sub
    70. Private Sub utc_IDlistChanged(sIDs As List(Of String)) Handles utc.IDlistChanged
    71. cmbEmpfaengerChat.Items.Clear()
    72. For Each ID In sIDs
    73. cmbEmpfaengerChat.Items.Add(ID)
    74. Next
    75. cmbEmpfaengerChat.SelectedIndex = cmbEmpfaengerChat.Items.Count - 1
    76. End Sub
    77. Private Sub utc_ServerIsShuttingDown() Handles utc.ServerIsShuttingDown
    78. guiZustandGetrennt()
    79. Me.Close()
    80. End Sub
    81. Private Sub utc_ServerPasswordWrong() Handles utc.ServerPasswordWrong
    82. guiZustandGetrennt()
    83. MsgBox("Serverpasswort ist leider nicht korrekt!", MsgBoxStyle.Exclamation)
    84. End Sub
    85. Private Sub utc_UTicketArrived1(sSenderID As String, bSentToAll As Boolean, sCommand As String, oUserData As List(Of Object)) Handles utc.UTicketArrived
    86. Select Case sCommand
    87. Case "chat"
    88. rtbChatAusgabe.AppendText("[" & getUhrZeit() & "] " & sSenderID & ": " & oUserData(0).ToString & vbNewLine)
    89. End Select
    90. End Sub
    91. Private Function getUhrZeit() As String
    92. Dim sStunde As String = My.Computer.Clock.LocalTime.Hour.ToString
    93. Dim sMinute As String = My.Computer.Clock.LocalTime.Minute.ToString
    94. If sStunde.Length = 1 Then
    95. sStunde = "0" & sStunde
    96. End If
    97. If sMinute.Length = 1 Then
    98. sMinute = "0" & sMinute
    99. End If
    100. Return sStunde & ":" & sMinute
    101. End Function
    102. Private Sub chatAbsenden()
    103. If txtChatEingabe.Text <> "" Then
    104. utc.sendUTicket(cmbEmpfaengerChat.Text, "chat", txtChatEingabe.Text)
    105. txtChatEingabe.Text = ""
    106. End If
    107. End Sub
    108. Private Sub txtChatEingabe_KeyUp(sender As Object, e As KeyEventArgs) Handles txtChatEingabe.KeyUp
    109. If e.KeyCode = Keys.Enter Then
    110. chatAbsenden()
    111. End If
    112. End Sub
    113. Private Sub txtPassword_KeyUp(sender As Object, e As KeyEventArgs) Handles txtPassword.KeyUp
    114. If e.KeyCode = Keys.Enter Then
    115. guiZustandVerbindungHerstellen()
    116. verbindungHerstellen()
    117. End If
    118. End Sub
    119. End Class
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Schon, aber ich möchte Programmierprobleme grundsätzlich im Forum lösen. Es genügt mir, wenn du mir schreibst, wie genau die Daten in den Stream geschrieben werden.
    Ansonsten kann dir sicher auch der Autor weiterhelfen oder du Schickst Nachrichten mit einem Escapezeichen.
    Ansatz bei Letzterem: Abonniere das TextChanged-Ereignis des Textfeldes, das zur Eingabe der Nachrichten verwendet wird und schicke dort jedes mal eine Nachricht raus, wenn es aufgerufen wird. Bspw. überträgst du die beiden Zeichen "\a", um zu signalisieren, dass der Benutzer tippt. Außerdem ersetzt du alle \-Zeichen im Eingabetext beim abschicken mit "\\". Auf der Empfängerseite gehst du alle Zeichen durch und schaust dir an, was du empfängst. Wenn es sich um eine Kombination "\a" handelt, handelt es sich um eine Steueranweisung, die du als "Es wird geschrieben" interpretierst, wenn es sich um "\\" handelt, schreibst du in die Eingabetextbox, "\", ansonsten das Zeichen, das du empfangen hast. Das nennt sich auch Escapesequenz.

    Viele Grüße
    ~blaze~
    Ich verstehe zwar dass was du mir geschrieben hast aber dennoch kann ich es nicht ohne ein Beispiel vervollständigen. Ich habe mal den Code (den ich nicht mehr habe) auch aus diesem Forum aber der ging LEIDER nicht.

    Ich möchte eigentlich das ganze in einem Timer machen (obwohl ich weiß dass das den PC ein bisschen langsamer macht). Hättest du dazu ein Beispiel das s zwar schon fertig ist aber trotzdem noch ein bisschen etwas fehlt?
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de

    Thiemo1991 schrieb:

    Ich möchte eigentlich das ganze in einem Timer machen
    Timer ist suboptimal.
    Nutze doch Dein vorhandenes KeyUp-Event, indem Du da nicht bloß die Enter-Taste abfragst.
    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!
    Aus diesem Unterforum habe ich den Chat als Vorlage aber ich darf den auch so verwenden.

    Kann irgendwer mir ein Bespiel dazu machen bzw. mir sagen was ich mir da dazu im Internet anschauen muss?
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Auf der Senderseite beim Abschicken von normalen Texten:

    VB.NET-Quellcode

    1. inputTextBox.Text.Replace("\", "\\")

    und zusätzlich im TextChanged-Ereignis der TextBox den Text "\a" verschicken.
    Auf der Empfängerseite (dort, wo du eigentlich in die TextBox schreibst):
    input ist der empfangene Text, otherIsNotTypingTimer ist der Timer unten, history ist die TextBox, die den Gesprächsverlauf enthält, otherIsTypingLabel ist das Label, das anzeigt, ob der andere Teilnehmer tippt (==> die Visible-Eigenschaft ist standardmäßig auf False zu setzen).

    VB.NET-Quellcode

    1. Dim receivedText As StringBuilder = Nothing
    2. Dim isEscaped As Boolean = False
    3. For Each c As Char in input
    4. If isEscaped Then
    5. If c = "a"c Then
    6. 'Der andere Teilnehmer tippt ==> siehe Timer
    7. otherIsTypingLabel.Show()
    8. otherIsNotTypingTimer.Stop()
    9. otherIsNotTypingTimer.Start()
    10. End If
    11. Else If c = "\"c Then
    12. isEscaped = True
    13. Continue For
    14. End If
    15. If receivedText Is Nothing Then receivedText = New StringBuilder()
    16. receivedText.Append(c)
    17. isEscaped = False
    18. Next
    19. 'Empfangenen Text rausschicken
    20. history.AppendText(If(receivedText Is Nothing, input, receivedText.ToString()))


    otherIsNotTypingTimer enthält im Tick-Event

    VB.NET-Quellcode

    1. otherIsTypingLabel.Hide()


    Das ist meine Idee umgesetzt.

    Viele Grüße
    ~blaze~