VersuchsChat mit leistungsfähigem Server

    • VB.NET

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

      Hallo,

      Das mit den Interface werde ich mal intern Inplementieren.

      Also, mir ist aufgefallen dass SMB ein WINS braucht damit die NamePipes auch Netzwerk übergreifend Funktionieren, also kann man einfach nur von NamePipes abraten außer man hat eh schon ein WIN Inplementiert, deswegen ist meine Idee ein Transparentes Gateway zu Inplementieren dass von NamePipes auf TCP umsetzt.

      Desweiteren setzt ich meine Netzwerk Protocole mit Serialisierung um, d.h. ich lege Generische klassen für RPC, Payload und co an und Serialisiere diese und anschlißend lasse ich diese nach der übertragung durch's Netzwerk (Wie auch Immer [TCP,NamePipes]) wieder Deserialisieren und so habe ich dann letzendlich eine Funktionierende Netzwerk Umgebung.

      Das Grundprinzip ist einfach, ich Zapfe Facebook, und cex.io über ihre endsprechenden API,s auf einen Zentralen Server an und die Clients greifen dann auf den Server zu und bekommen über diesen dann ihre Daten aus den jewailigen API,s übertragen.

      LG, Herbrich
      Hi,

      Ich hätte da mal ne kleine Frage: und zwar, wie was genau bedeuten diese Befehle?

      VB.NET-Quellcode

      1. Protected Sub OnStatusMessage(ParamArray segments As String())
      2. RaiseEvent StatusMessage(Me, New NotifyEventArgs(Of String)(String.Concat(segments)))
      3. End Sub


      Was hier gemacht wird ist mir durchaus klar aber ich verstehe das (String.Concat(segments) nicht so ganz, ok man hat ein Array von Strings was hier zu einen einzigen String zusammen gefügt wird aber wozu??

      Ich habe mir mal den TCP-Tranciver (nene es so weil Server / Client in einen^^) heruntergeladen. Und es wird nie die ganze gesendete Zeichenfolge am Server empfangen. IP ist 127.0.0.1 (also der Lokale Endwicklungsterminalserver).

      Und weil der String nicht komplett ist Failt auch meine JSON Deserialisierung.

      Übrigens: Ich habe den Fehler in meinen Namepipe Project gefunden, der Client muss nicht nur die Pipe kennen sondern auch den Server auf dem sie gehostet wird. ^^

      LG, Herbrich
      Hallo,

      @ErfinderDesRades, könntest du vlt eine einfache C&P-Version dees Servers machen, mich Stört vor allen die Basis klasse, da Client und Server nicht ein und dass selbe Programm ist.

      Ich frage nur nach einer C&P-version weil ich dann leichter dass Protocol inplementieren und die Client Clase mit endsprechen weiteren eigenschaften versorgen kann. Ich habe schon eine Inplementierung versucht, bei der wird mir aber immer der Serialisierte Payload abgeschnitten nach X (ich weiß nicht mehr genau wie viele, habe nicht nachgezählt) zeichen. Und mit WireShark habe ich herausgefunden dass auch so ziemlich nur die hälfte des Strings übertragen wird.

      LG, Herbrich
      Tja, leider habich technische Probleme mitte Forum-Software und kann ich grad keine Uploads machen, also schick ichs dir per Mail

      Ich denke aber, dir sind die Vorzüge von Vererbung noch nicht ganz klar.
      Weil sowohl Server als auch Client müssen disposable sein, ein Disposed-Event werfen und müssen Statusmeldungen ausgeben können - das ist jetzt redundant gecodet.
      Ja, und dieses lustige Form, was sowohl Server als auch Client sein konnte, hab ich natürlich auch aufteilen müssen - das ist jetzt auch alles doppelt.

      Aber hast auch recht damit, dass die Architektur das Aufsetzen eines differenzierten Protokolls erschwert.
      Evtl. - hab ich noch nicht ganz durchdacht - braucht man sogar 2 Protokolle, weil die Server-Seite muss ja anners ticken als die Client-Seite.
      Bisher waren die Protokolle ja gewissermaßen festverdrahtet:
      Der Client kann nur Strings senden, empfangen und anzeigen
      Der Server kann an alle Clients senden, kann von allen empfangen, alles empfangene anzeigen, und das von allen empfangene wiederum an alle weiterleiten.

      Also beide können senden, empfangen, anzeigen - nur beim Server bedeutet das immer: an alle
      Darüberhinaus kann der Server noch weiterleiten

      achso - kannst du also mein Werk in einem Post von dir anhängen?

      Weil diese basisklassen-lose Version finden vlt. annere auch interessant

      ErfinderDesRades schrieb:

      ich verwende in Clientklasse nun BinraryReader/-Writer zum Lesen/Schreiben in den NetworkStream.
      Nicht nur wird der Code dadurch noch bisserl übersichtlicher, v.a. eröffnet das die Möglichkeit, auch andere Daten als nur Strings zu übertragen.
      Statt der asynchronen TcpClient.BeginRead() - Methode wird nun von der BinaryReader.Read()-Methode ein Func(Of String)-Delegat gebildet, der per .BeginInvoke() ebensogut asynchron aufgerufen werden kann:

      VB.NET-Quellcode

      1. Imports System.Net.Sockets
      2. Imports System.IO
      3. Public Class Client : Inherits TCPBase
      4. Private _TcpClient As TcpClient, _Reader As BinaryReader, _Writer As BinaryWriter, _dlgReadString As Func(Of String)
      5. Public Sub New(TC As TcpClient)
      6. _TcpClient = TC
      7. Dim strm = _TcpClient.GetStream
      8. _Reader = New BinaryReader(strm)
      9. _Writer = New BinaryWriter(strm)
      10. _dlgReadString = AddressOf _Reader.ReadString
      11. _dlgReadString.BeginInvoke(AddressOf EndRead, Nothing)
      12. End Sub
      13. Private Sub EndRead(ar As IAsyncResult)
      14. If MyBase.IsDisposed Then Return
      15. Try
      16. Dim msg = _dlgReadString.EndInvoke(ar)
      17. CrossThread.RunGui(AddressOf OnChatMessage, msg)
      18. _dlgReadString.BeginInvoke(AddressOf EndRead, Nothing) 'asynchrone Rekursion
      19. Catch ex As EndOfStreamException
      20. CrossThread.RunGui(AddressOf OnStatusMessage, "CounterClient shut down")
      21. CrossThread.RunGui(AddressOf MyBase.Dispose)
      22. End Try
      23. End Sub
      24. Public Overrides Sub Send(Msg As String)
      25. _Writer.Write(Msg)
      26. End Sub
      27. Protected Overrides Sub Dispose(disposing As Boolean)
      28. DisposeAll(_Writer, _Reader, _TcpClient)
      29. End Sub
      30. End Class

      (update in post#1)


      Und wie kann ich nun über diese Methode Bytes empfangen ? ReadBytes anstelle von ReadString und austausch bei der Func von String zu Byte() geht nämlich nicht. GetBytes() braucht einen Index :/ Geht das nicht auch in "einem Rutsch" ? ?(

      MfG

      Hab es so gemacht, aber das klappt auch nicht :/

      Die Signatur der Public Overridable Function Read() As Integer-Methode ist mit dem Delegaten "Delegate Function Func(Of Byte())() As Byte()" nicht kompatibel

      VB.NET-Quellcode

      1. _ReadByte As Func(Of Byte())
      2. sub new(byval tc as tcpclient)
      3. _TcpClient = TC
      4. Try
      5. Dim ClientStream = _TcpClient.GetStream
      6. _Reader = New BinaryReader(ClientStream)
      7. _Writer = New BinaryWriter(ClientStream)
      8. ReadByte = AddressOf _Reader.Read
      9. _ReadByte.BeginInvoke(AddressOf EndRead, Nothing)
      10. Catch ex As Exception
      11. Me.Dispose()
      12. End Try
      13. end sub


      Gibt es da nichts, womit es so funktioniert wie mit dem String ? :/

      MfG
      nö, hatternich, der BinaryWriter/Reader.
      Man könnte aber eine Extension schreiben, die diese Funktionalität dranpatcht.
      Beim Schreiben eines Arrays würde die Extension erstmal die Länge desselben reinschreiben.
      Und beim Lesen könnte das dann ausgelesen werden, sodass das Array richtig dimensioniert wern kann.
      Hallo,

      Ich kann dir ja mal schicken was ich bissjetzt habe.

      Und die Vorzüge von vererbung sind mir zwar bewusst, aber wen ich eine Klasse habe die in zwei Projecten (fast Identisch) ist (auf Serverseite speichere ich in der Clien klasse noch einige Anfallenden Daten), dann muss ich damit die Vererbung klappt die Basisklasse in beide Programme (Solutions) inplementieren die ja Theoretisch völlig unabhänhgig von einander sind (nur eben TCP-Verbindung^^).

      Und da erkenne ich kein vorteil.

      Desweiteren, die Crossthread Classe?? Die ist doch Theoretisch in so weit umnötig da ein Fertiger Server ja NIE in einer Form laufen wird. Ich habe mir überlegt eine Lokale NamePipe zu machen um dann eben den Server mit einer Managmend Software (UI) anzusprechen und der Server selber ist ja ein Windows Dienst (Fertig Inplementiert versteht sich, z.Z. nur CMD weil WS s****e zu Debugen ist.

      LG, Herbrich
      Es empfiehlt sich wahrscheinlich, die Programme modular aufzubauen, also ein Helpers-Projekt coden, was in beiden Projekten eingebunden ist.
      Dort hinein gehören Basisklassen von Klassen, die sowohl im Server als auch im Client existieren.
      Aber dort gehören bestimmt auch die Protokoll-Definitionen hinein.
      Ich zB. habe sehr umfangreiche HelpersProjekte, also eigentlich Bibliotheken, die ich in alles einbinde, was zB mit Winforms arbeitet, und eine annere, für überhaupt alles annere.
      Ohne meine Helferlein fangich ühaupt nicht an zu coden. Aber hier käme wie gesagt noch ein klein "ChatHelper"-HelpersProjekt hinzu.
      Schlechte Architektur wäre, wenn in beiden Projekten dieselbe oder sehr ähnliche Funktionalität zwei mal gecodet wäre.
      Hallo,

      In mein Fall reden wir hier von hnet.dll, jennifer14.dll und herbrich.dll

      wo bei reicht ein Interface nicht aus?? Ich habe auch erstmal angefangen nach den erstellen der WinForms (Ohne eine einzige Form :D ) mit denn DLL,s in einigen sind die forms drinnen und in den übrigen als die Klassen die so in Hintergrund laufen.

      LG, Herbrich
      Ich habe nun einige Stunden mit dem Beispiel rumgespielt, sowie auch ein eigenes Projekt aufgesetzt. Klappt alles super!

      Allerdings bin ich momentan noch am scheitern, wie du ausmachst, ob etwas Chat relevante Nachrichten sind, oder ob diese Status/Servernachrichten sind?
      Polling is trolling!

      Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
      Hab ich selbstverständlich gemacht und hatte ich dann auch vermutet, ich dachte nur du hättest sowas wie 2 verschiedene Protokolle, also Servernachrichten getrennt von Chatnachrichten.

      Zb. mit einem Prefix o.ä.

      Aber dann habe ich auch gesehen, dass du dann einfach nur das onStatusMessage aufrufst.
      Dann muss ich mal schauen an welcher Stelle ich sowas implementiere.
      Polling is trolling!

      Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
      Hallo,

      Ich nutze für die etablierung eins Protocols immer Klassen die ich Serialisiere, durch den Stream Jahe und anschlißend wieder Deserialisiere.

      LG, Herbrich
      Hallo,

      Ich würde gerne denn Multiserver von vbparadise (Auf den mein Sys z.Z.) basiert Portieren da dieser schneller Läuft und ich ein Server für mein Bot brauche!

      LG, Herbrich
      Hallo,

      Du adressierst die Clients iwie oder nutzt die IP-Adresse und ersetzt DataRecived (Das Event wen Daten am Client reinkommen) und löscht SchreibeAnJedenClient / SendToAll oder so ähnlich und inplementierst dass Protokol. (Serialisierung, Text, Binär, oder so ähnlich, musst du wissen wie du es vorhast).

      Also es ist (zumindest für mich) eig ganz einfach :)

      LG, Herbrich