VersuchsChat mit leistungsfähigem Server

    • VB.NET

    Es gibt 80 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

      Wie bereits erwähnt möchte ich das mein Event ausgelöst wird, wenn der Client disposed wird.
      Das muss aber logischerweise geschehen, bevor der disposed wird , wie soll man sonst den
      TCPClient dem Event übergeben, wenn er schon "gelöscht" wurde.

      Sag mir bitte wie das gehen soll.


      Das ist jetzt aber ein Themawechsel.
      Bisher hattest du ein Problem, dein Event zu empfangen, nun, es zu senden?


      Daniel Baumert schrieb:

      Wie bereits erwähnt möchte ich das mein Event ausgelöst wird, wenn der Client disposed wird.
      (wo hastn das erwähnt?) Also dann löse es doch im Dispose-Override des Client aus.

      Daniel Baumert schrieb:

      Sag mir bitte wie das gehen soll.
      mittm RaiseEvent - Schlüsselwort.
      Meinst Du so?


      VB.NET-Quellcode

      1. Public Class Server : Inherits TCPBase
      2. Public Event IndividRemove As EventHandlerEx(Of TcpClient)
      3. Protected Sub IndividRe(se As TcpClient)
      4. Throw New Exception("step 1 okay")
      5. RaiseEvent IndividRemove(se)
      6. End Sub
      7. Private EasyListNa As TcpListener
      8. Private AllClientz As New List(Of Client)
      9. Public Sub New(EP As IPEndPoint)
      10. EasyListNa = New TcpListener(EP) With {.ExclusiveAddressUse = False}
      11. EasyListNa.Start()
      12. EasyListNa.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
      13. End Sub
      14. Private Sub EndAccept(ar As IAsyncResult)
      15. If MyBase.IsDisposed Then Return
      16. With New Client(EasyListNa.EndAcceptTcpClient(ar))
      17. AddHandler .ChatMessage, AddressOf Client_ChatMessage
      18. AddHandler .StatusMessage, AddressOf Client_StatusMessage
      19. AddHandler .Disposed, AddressOf Client_Disposed
      20. .AddTo(AllClientz)
      21. .AddTo(HelperClazz.AllClient)
      22. End With
      23. CrossThread.RunGui(AddressOf OnStatusMessage, Ste.Enc("TCPClient accepted"))
      24. EasyListNa.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
      25. End Sub
      26. #Region "_Clients-Ereignisverarbeitung"
      27. Private Sub Client_Disposed(Sender As TCPBase)
      28. 'den Client für die beendete Verbindung entfernen
      29. Sender.RemoveFrom(AllClientz)
      30. Sender.RemoveFrom(HelperClazz.AllClient)
      31. End Sub
      32. Private Sub Client_ChatMessage(sender As Object, e As NotifyEventArgs(Of String))
      33. 'Send(e.Value) Bei einem Client ankommende ChatMessages anzeigen und an alle anderen Clients senden
      34. OnStatusMessage(e.Value)
      35. End Sub
      36. Private Sub Client_StatusMessage(sender As Object, e As NotifyEventArgs(Of String))
      37. 'einkommende StatusMessages durchreichen (zur Anzeige)
      38. OnStatusMessage(e.Value)
      39. End Sub
      40. #End Region
      41. Public Overrides Sub Send(Msg As String)
      42. 'OnChatMessage(Msg) ' Server soll Eigene Nachrichten anzeigen
      43. Parallel.ForEach(AllClientz, Sub(w As Client) w.Send(Msg))
      44. End Sub
      45. Public Overrides Sub Send(Msg As Byte)
      46. 'OnChatMessage(Msg) ' Server soll Eigene Nachrichten anzeigen
      47. Parallel.ForEach(AllClientz, Sub(w As Client) w.Send(Msg))
      48. End Sub
      49. Protected Overrides Sub Dispose(disposing As Boolean)
      50. EasyListNa.Stop()
      51. For i As Integer = AllClientz.Count - 1 To 0 Step -1
      52. Throw New Exception(i.ToString) 'Zum testen
      53. IndividRe(AllClientz(i).TC)
      54. AllClientz(i).Dispose()
      55. Next
      56. End Sub
      57. End Class


      Da greift weder das "Throw New Exception("step 1 okay")" noch wird IndividRemove ausgelöst.
      ich verstehe nicht, was du meinst was ich meine.

      ah - jetzt sehe ich: Ich schreib

      ErfinderDesRades schrieb:

      Also dann löse es doch im Dispose-Override des Client aus.
      und promt fügste du es im Server ein.
      Weil ich ja sag "Client"

      Aber vlt. erklärst du, was dieses IndivRe-Event ühaupt soll.
      Höchst-Wahrscheinlich gehört es nämlich nicht in die TcpBase-Klasse, und evtl. ists sogar komplett üflüssig.
      Ok sorry, hab dich dann falsch verstanden (weil Du geschrieben hattest "des Client" , war ich unsicher).

      Aber wenn ich das Event in Client einfüge:

      VB.NET-Quellcode

      1. Public Class Client : Inherits TCPBase
      2. Public Event Individ As EventHandlerEx(Of TcpClient)
      3. Protected Sub OnIndivid(se As TcpClient)
      4. RaiseEvent Individ(se)
      5. End Sub


      Kann ich es auf die polymorphe Objektinstanz (die btw.

      VB.NET-Quellcode

      1. Private WithEvents EasyServer As TCPBase
      ist) , nicht abonnieren , da nicht "sichtbar/verfügbar"

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

      Hallo,

      Warum ist die TCP Base eigentlich kein Interface?? :D
      Hallo,

      Wie sieht es eigentlich aus mit der Portierbarkeit von Servern die auf den vbparadise Multiserver aufbauen??

      LG, Herbrich
      Meinst du den, der für jeden Client einen neuen Thread erstellt ?
      Wenn die Klassen (Server, Client) ähnlich bis gleich aufgebaut sind, mit ein paar mal "Strg+C, Strg+V".
      Oder ich verstehe deine Frage einfach nicht, vom Sinn her macht ja dieser Server exakt das selbe, nur besser. Was du mit den Daten machst (Event triggern, nach Bielefeld weiterleiten, usw.) ist ja dir überlassen.

      MfG

      Unnötiges Vollzitat entfernt. ~Thunderbolt

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

      Hallo,

      Mein Konrektes Problem ist das die übertragenen Strings nach X Zeichen abgeschnitten werden was dazu für dass meine JSON Deserialisierungs Routine immer ein netten Error ausgiebt.

      LG, Herbrich
      Das hatten wir doch schonmal - das war doch das Problem, dass ein ZippStream den letzten Block nicht verschickt, oder? Und da hatteste doch auch eine Lösung für ?

      Daniel Baumert schrieb:

      Wollte nur nochmal Fragen wegen des Problems aus Post 66..
      Wollte nur nochmal erinnern an die Frage an dich aus post#65 ;)
      Hallo,

      Ne, der zipstream war nicht einmal inplementiert, das war noch bevor ich irgendwas damit machen konnte. Ich habe par Testklassen für die Serialisierung erstellt aber ging leider scheif weil die Strings abgeschnitten wurden.

      LG, Herbrich
      Hallo,

      Ich versuche noch mal das Sample mit den Namepipes iwie sinvol einsetzbar zu machen (Stichwort Protokoll). So, nun ist die sache leider so dass scheinbar der buffer einfach viel zu klein ist. Deswegen werden immer bei größeren Payloads Strings abgeschnitten was unweigerlich zu Problemen mit Decodierug und Deserialisierung fürht. Kann man den Buffer weglassen oder in zumindest automatsich vergrößern.

      Falls beides nein, lässt sich wiei ein Stream Reader und ein Stream Writer Inplementiern, die habe so weit ich weiß das Problem nicht.

      LG, Herbrich
      Auf die Idee bin ich schon gekommen, aber ich Arbeite mit Strings. Die Nameppes sollen für ein Cluster eingesetzt werden um eine bestehende Server Software Skalierbar zu machen. Die Protokole bestehen aus Base64 Codierten Serialisierten Strings.

      Hättest du ein beispiel ansatz, ich bin auf die blöde idee gekommen ein Wörterbuch zu machen wo als Key die Node-ID (Integer wert der den Knoten in Cluster addressiert) und als Value eine Liste von Strings die nach ner bestimmten anzahl wieder zu einen geamcht wurde. Leider ohne erfolg :(

      Ich versuche jetzt mal das Beispiel Project zu DDoSen mit überlangen Strings, ma kucken ob odrt auch was abgeschnitten wird. Wen nein liegt's an meiner Inplementierung.

      Ok, es klappt im Test Programm, ich habe nur alle Invoke dinger rausgenommen da ich (noch) in einer Console Arbeite und keine Windows Forms nutze und die sind sträflich verobten in Windows diensten da sie nur umnötige sicherheitslücken öffnen. Und wer soll die bitte bedienen. Also von darher mache ich dass alles ohne UI für einen Windows Dienst.

      Jetzt ist die Frage: Was macht CrossTradhInvode, das ist doch nur der Invoker für den windows forms tradh oder nicht??

      LG, Herbrich

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „J.Herbrich“ ()

      HTTP ist ja auch ein Text Protocol. Ich finde dass Serialisieren von Klassen sehr einfach.
      Hallo,

      @Erinder des Rades könntest du bitte vieleicht mal eine Version der Servers als Console Application schreiben. Ich komme mit diesen Invoker nicht z recht. Immer wen ich den rausnehme werden zeichen abgeschnitten :(

      Liebe Grüße, J. Herbrich