vb 2015 - Chat mit UTicket.dll

  • VB.NET

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

    Sei ehrlich. Verstehst du mehr als 50% dessen was du hier überhaupt codest? Nach meiner Einschätzung sind es nämlich deutlich weniger als 50%.
    Und wenn das so ist, dann setzt das hier (wie seit Jahren) wiedermal am komplett falschen Punkt an.
    Du kannst auch kein Buch auf Spanisch verfassen ohne die Sprache zu können. Da nützt es dir auch nichts wenn dir jemand einzelne Sätze hinwirft.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich finde es klasse @~blaze~ das du die Geduld bewahrst und versuchst diesem Jungen zu helfen,
    ich glaube ich weiß auch wieso du dies tust,
    und @TE ich bedauere sehr, dass du an Muskelkrämpfen leidest... aber klüger wäre es doch, wenn du lernst, statt bittest?

    Bitten ist eine heikle Sache.. wenn die Welt mit "Bitten und Danken" funktionieren würde, gäbe es keine Zinsen.

    Bring einem Obdachlosen das Fischen bei, und es wird auf immer glücklich sein.
    Und Gott alleine weiß alles am allerbesten und besser.
    Eins der Probleme hab' ich, glaub' ich, identifiziert: Receive soll natürlich nicht in Send aufgerufen werden, das war nur drin, um zu demonstrieren, was getan werden soll.

    Ich verstehe ja, dass ihr an etwas anderem ansetzt, als dem im Thema behandelten Problem, @Acr0most, @thefiloe, @φConst, aber ich denke nicht, dass durch gut gemeinten (und manchmal auch inadäquat ausgedrücktem) Rat sich das Problem von alleine lösen wird.

    @Thiemo1991
    Die obige Frage ist vielleicht aber wirklich etwas indirekt gestellt. Weißt du denn, was ich mit meinem Code vorhabe, bzw. welche Idee hinter meinem Code steckt? Magst du mir vielleicht auch schreiben, was genau du denkst, dass ich damit vorhabe?

    Viele Grüße
    ~blaze~
    Na gut, dann widme ich mich auch mal seinem Problem.

    @TE, eventualiter hilft auch mein Ansatz:

    Du hast einen Benutzer - der Client - der sich nun mit seinem Freund in Kontakt setzt und ihm schreibt.
    Jede Chat-Applikation stellt mindestens zwei TextBoxen zur Verfügung :
    Der empfangene und der zu sendende Text.
    ( Meinetwegen kann statt eine TextBox eine ListBox für das Empfangen in Betracht gezogen werden).

    Die Klasse TextBox, respektive jedes Control stellt sogenannte Events zur Verfügung.
    Events - Englisch: Ereignisse - werden unter bestimmten Konditionen ausgelöst.

    Genau diese Funktionalität machst du dir zu Nutzen.

    TextBox hat zwei hierfür relevante Events : KeyDown, KeyUp.

    VB.NET-Quellcode

    1. Public Partial Class Form1
    2. Inherits Form
    3. Private startedAnalyzing As Boolean, isTyping As Boolean
    4. Private stopWatch As New Stopwatch()
    5. Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs)
    6. If Not startedAnalyzing Then
    7. Task.Run(Function()
    8. While startedAnalyzing
    9. If isTyping Then
    10. stopWatch.Reset()
    11. stopWatch.Start()
    12. Me.InvokeI(New Action(Function()
    13. label1.Text = "Is typing!"
    14. End Function))
    15. Else
    16. If stopWatch.Elapsed.TotalMilliseconds >= 500 Then
    17. startedAnalyzing = False
    18. End If
    19. End If
    20. New ManualResetEvent(False).WaitOne(1)
    21. End While
    22. Me.InvokeI(New Action(Function()
    23. label1.Text = "Nothing!"
    24. End Function))
    25. End Function)
    26. startedAnalyzing = True
    27. End If
    28. isTyping = True
    29. End Sub
    30. Private Sub textBox1_KeyUp(sender As Object, e As KeyEventArgs)
    31. isTyping = False
    32. End Sub
    33. End Class
    34. Public NotInheritable Class Extension
    35. Private Sub New()
    36. End Sub
    37. <System.Runtime.CompilerServices.Extension> _
    38. Public Shared Sub InvokeI(frm As Form, action As Action)
    39. frm.Invoke(action)
    40. End Sub
    41. End Class
    42. '=======================================================
    43. 'Service provided by Telerik (www.telerik.com)
    44. 'Conversion powered by NRefactory.
    45. 'Twitter: @telerik
    46. 'Facebook: facebook.com/telerik
    47. '=======================================================

    Original C# Code:

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. bool startedAnalyzing, isTyping;
    4. Stopwatch stopWatch = new Stopwatch();
    5. private void textBox1_KeyDown(object sender, KeyEventArgs e)
    6. {
    7. if (!startedAnalyzing)
    8. {
    9. Task.Run(() =>
    10. {
    11. while (startedAnalyzing)
    12. {
    13. if (isTyping)
    14. {
    15. stopWatch.Reset();
    16. stopWatch.Start();
    17. this.InvokeI(new Action(() =>
    18. {
    19. label1.Text = "Is typing!";
    20. }));
    21. }
    22. else
    23. {
    24. if (stopWatch.Elapsed.TotalMilliseconds >= 500)
    25. {
    26. startedAnalyzing = false;
    27. }
    28. }
    29. new ManualResetEvent(false).WaitOne(1);
    30. }
    31. this.InvokeI(new Action(() =>
    32. {
    33. label1.Text = "Nothing!";
    34. }));
    35. });
    36. startedAnalyzing = true;
    37. }
    38. isTyping = true;
    39. }
    40. private void textBox1_KeyUp(object sender, KeyEventArgs e)
    41. {
    42. isTyping = false;
    43. }
    44. }
    45. public static class Extension
    46. {
    47. public static void InvokeI(this Form frm, Action action)
    48. {
    49. frm.Invoke(action);
    50. }
    51. }


    Erläuterung:

    Ich habe zwei Variablen vom Typ Boolean deklariert ( True/False ).
    Die Variable "isTyping" fungiert als Flag, um kennzuzeichnen, das der Benutzer schreibt.
    startedAnalyzing ist die Kondition für die while-Schleife; dieser wird beendet , wenn 0.5 Sekunden nichts geschrieben wird.

    In der If-Kondition im KeyDown Event kannst du nun den zu informierenden Client benachrichtigen , dass du schreibst, (Send("writing=true")).
    Wenn nun 0.5 Sekunden lang nichts eingegeben wird, springt die Applikation aus der While-Schleife.. ausserhalb der While-Schleife kannst du nun den zu informierenden Client benachrichtigen Send("writing=false")...

    Task.Run() führt die Schleife in einem neuen Thread aus, new ManuelResetEvent(false).WaitOne(1) ist notwendig, damit die CPU Last nicht exorbitant steigt... eventualiter wäre sogar dies mit einem WaitHandle eleganter.. ist ja aber nur provisorisch.

    Liebe Grüße.

    Edit: , du kannst auch

    C#-Quellcode

    1. this.InvokeI(new Action(() =>
    2. {
    3. label1.Text = "Is typing!";
    4. }));
    ausserhalb der Task.Run() Methode ausführen, musst dann eben nicht Invoken.
    Und Gott alleine weiß alles am allerbesten und besser.
    Danke für den Code, @φConst Ich habe zwar schon den ganzen Code probiert aber da kommen 10 Fehler bei mir hoch.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de

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

    ~blaze~ schrieb:

    Eins der Probleme hab' ich, glaub' ich, identifiziert: Receive soll natürlich nicht in Send aufgerufen werden, das war nur drin, um zu demonstrieren, was getan werden soll.

    Ich verstehe ja, dass ihr an etwas anderem ansetzt, als dem im Thema behandelten Problem, @Acr0most, @thefiloe, @φConst, aber ich denke nicht, dass durch gut gemeinten (und manchmal auch inadäquat ausgedrücktem) Rat sich das Problem von alleine lösen wird.

    @Thiemo1991
    Die obige Frage ist vielleicht aber wirklich etwas indirekt gestellt. Weißt du denn, was ich mit meinem Code vorhabe, bzw. welche Idee hinter meinem Code steckt? Magst du mir vielleicht auch schreiben, was genau du denkst, dass ich damit vorhabe?

    Viele Grüße
    ~blaze~


    Ich verstehe zwar ein bisschen den Code aber kann es LEIDER nicht wiedergeben.

    φConst schrieb:

    Na gut, dann widme ich mich auch mal seinem Problem.

    @TE, eventualiter hilft auch mein Ansatz:

    Du hast einen Benutzer - der Client - der sich nun mit seinem Freund in Kontakt setzt und ihm schreibt.
    Jede Chat-Applikation stellt mindestens zwei TextBoxen zur Verfügung :
    Der empfangene und der zu sendende Text.
    ( Meinetwegen kann statt eine TextBox eine ListBox für das Empfangen in Betracht gezogen werden).

    Die Klasse TextBox, respektive jedes Control stellt sogenannte Events zur Verfügung.
    Events - Englisch: Ereignisse - werden unter bestimmten Konditionen ausgelöst.

    Genau diese Funktionalität machst du dir zu Nutzen.

    TextBox hat zwei hierfür relevante Events : KeyDown, KeyUp.

    VB.NET-Quellcode

    1. Public Partial Class Form1
    2. Inherits Form
    3. Private startedAnalyzing As Boolean, isTyping As Boolean
    4. Private stopWatch As New Stopwatch()
    5. Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs)
    6. If Not startedAnalyzing Then
    7. Task.Run(Function()
    8. While startedAnalyzing
    9. If isTyping Then
    10. stopWatch.Reset()
    11. stopWatch.Start()
    12. Me.InvokeI(New Action(Function()
    13. label1.Text = "Is typing!"
    14. End Function))
    15. Else
    16. If stopWatch.Elapsed.TotalMilliseconds >= 500 Then
    17. startedAnalyzing = False
    18. End If
    19. End If
    20. New ManualResetEvent(False).WaitOne(1)
    21. End While
    22. Me.InvokeI(New Action(Function()
    23. label1.Text = "Nothing!"
    24. End Function))
    25. End Function)
    26. startedAnalyzing = True
    27. End If
    28. isTyping = True
    29. End Sub
    30. Private Sub textBox1_KeyUp(sender As Object, e As KeyEventArgs)
    31. isTyping = False
    32. End Sub
    33. End Class
    34. Public NotInheritable Class Extension
    35. Private Sub New()
    36. End Sub
    37. <System.Runtime.CompilerServices.Extension> _
    38. Public Shared Sub InvokeI(frm As Form, action As Action)
    39. frm.Invoke(action)
    40. End Sub
    41. End Class
    42. '=======================================================
    43. 'Service provided by Telerik (www.telerik.com)
    44. 'Conversion powered by NRefactory.
    45. 'Twitter: @telerik
    46. 'Facebook: facebook.com/telerik
    47. '=======================================================

    Original C# Code:

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. bool startedAnalyzing, isTyping;
    4. Stopwatch stopWatch = new Stopwatch();
    5. private void textBox1_KeyDown(object sender, KeyEventArgs e)
    6. {
    7. if (!startedAnalyzing)
    8. {
    9. Task.Run(() =>
    10. {
    11. while (startedAnalyzing)
    12. {
    13. if (isTyping)
    14. {
    15. stopWatch.Reset();
    16. stopWatch.Start();
    17. this.InvokeI(new Action(() =>
    18. {
    19. label1.Text = "Is typing!";
    20. }));
    21. }
    22. else
    23. {
    24. if (stopWatch.Elapsed.TotalMilliseconds >= 500)
    25. {
    26. startedAnalyzing = false;
    27. }
    28. }
    29. new ManualResetEvent(false).WaitOne(1);
    30. }
    31. this.InvokeI(new Action(() =>
    32. {
    33. label1.Text = "Nothing!";
    34. }));
    35. });
    36. startedAnalyzing = true;
    37. }
    38. isTyping = true;
    39. }
    40. private void textBox1_KeyUp(object sender, KeyEventArgs e)
    41. {
    42. isTyping = false;
    43. }
    44. }
    45. public static class Extension
    46. {
    47. public static void InvokeI(this Form frm, Action action)
    48. {
    49. frm.Invoke(action);
    50. }
    51. }


    Erläuterung:

    Ich habe zwei Variablen vom Typ Boolean deklariert ( True/False ).
    Die Variable "isTyping" fungiert als Flag, um kennzuzeichnen, das der Benutzer schreibt.
    startedAnalyzing ist die Kondition für die while-Schleife; dieser wird beendet , wenn 0.5 Sekunden nichts geschrieben wird.

    In der If-Kondition im KeyDown Event kannst du nun den zu informierenden Client benachrichtigen , dass du schreibst, (Send("writing=true")).
    Wenn nun 0.5 Sekunden lang nichts eingegeben wird, springt die Applikation aus der While-Schleife.. ausserhalb der While-Schleife kannst du nun den zu informierenden Client benachrichtigen Send("writing=false")...

    Task.Run() führt die Schleife in einem neuen Thread aus, new ManuelResetEvent(false).WaitOne(1) ist notwendig, damit die CPU Last nicht exorbitant steigt... eventualiter wäre sogar dies mit einem WaitHandle eleganter.. ist ja aber nur provisorisch.

    Liebe Grüße.

    Edit: , du kannst auch

    C#-Quellcode

    1. this.InvokeI(new Action(() =>
    2. {
    3. label1.Text = "Is typing!";
    4. }));
    ausserhalb der Task.Run() Methode ausführen, musst dann eben nicht Invoken.



    So wie ich auch schon geschrieben habe, funktioniert die Lösung an Code von dir LEIDER nicht.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    Sicher ?
    Bei mir funktioniert es ^^ , glaub nicht das das an meinem Computer liegt.

    Zeig mal wie du es implementiert hast.
    Hoffentlich nicht einfach C&P .. deswegen sieht der Code ein wenig kryptisch aus.
    Und Gott alleine weiß alles am allerbesten und besser.

    φConst schrieb:

    Sicher ?
    Bei mir funktioniert es ^^ , glaub nicht das das an meinem Computer liegt.

    Zeig mal wie du es implementiert hast.
    Hoffentlich nicht einfach C&P .. deswegen sieht der Code ein wenig kryptisch aus.


    Wie soll ich denn das sonst tun?
    Ich musste es wieder entfernen da das überhaupt nicht funktioniert hat.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de
    So, ich habe mir genehmigt die Tcp-Klasse zu verwenden , die ich im Sourcecode-Austausch veröffentlichte.
    Hier mal eine Gif vom Resultat:

    giphy.com/gifs/l46Cqrh3RQewZZMEE/tile

    Das Chat umfasst zwei Zip-Pakete,
    eine ist der Server, das andere der Client( Win Forms ).

    Beim Start des Servers wird der Benutzer aufgefordert die IP und den Port im Schema "0.0.0.0:0000" einzugeben, wobei 0 ersetzt werden muss.

    Anschließend muss ein weiterer Client mit dem Server in Verbindung setzen, voila , senden und empfangen + Schreibstatus determinieren.
    Alles mit nur ein paar Zeilen Code ... Serialisierung eben 8o .


    Ich permittiere die Applikationen zu dekompilieren.
    Dateien
    • Client.zip

      (15,73 kB, 69 mal heruntergeladen, zuletzt: )
    • Server.zip

      (13,16 kB, 66 mal heruntergeladen, zuletzt: )
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „φConst“ ()

    Ne, ne, muss.
    Hab's diesmal mit Laptop und Pc, + Pc zu Laptop, Laptop zu Pc getestet.

    Hast es wohl nicht wie aufgefordert eingegeben also ip:port

    und der Port muss selbstverständlich freigeschaltet sein ;)

    Edit; Ich weiß woran es liegt.
    Der TcpListener bindet an die lokale Ip.
    Einsehbar : Cmd -> ipconfig -> IPv4 -Adresse.
    Und Gott alleine weiß alles am allerbesten und besser.

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

    Ich hab schon öfters mit sowas gearbeitet und auch deine explizite Aufforderung gelesen und alles richtig eingegeben, weil es mit meiner IPv4-Adresse ja funktionierte ;)
    Schon klar wie das alles funktioniert, wollte dir das nur sagen, denn per localhost sollte es auch funktionieren.
    Ich habe bewusst nicht IpAddress.Any oder "0.0.0.0" gewählt.
    Wenn's dich interessiert wieso:

    Sieht meines Erachtens schöner aus, aber ja, es verliert dadurch eine fundamentale (imho rudimentäre) Funktionalität.
    Ich wundere mich dann immer, wieso es obsolet ist, den TcpListener mit einem Parameter zu instanziieren (int) und es neu ist,
    einen IPEndPoint zu deklarieren (IPEndPoint), der doch genau dasselbe tun wird, wenn man .Any benutzt.
    Und Gott alleine weiß alles am allerbesten und besser.
    Das sind LEIDER nur fertige ausführbare Dateien und KEINE Projektmappen. Um es besser nachzuvollziehen wie was funktioniert, brauche ich das ganze Projekt.
    Wie man mich kontaktieren kann:
    thiemo-melhorn.de