VersuchsChat mit leistungsfähigem Server
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 80 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.
-
-
Die Basis Klassen nerven, die am besten gegen ein Interface austauschen. Oder ganz Weg damit, genau wie diese GUI Invoke (Server haben keine GUI zu haben, sie sind endweder CMD,s oder Dienste!).
BTTT (Back to the Topic):
Für mich ist es tatsächlich so einfach, ich bin aber ja auch Hacker.
LG, Herbrich -
-
-
-
Wie bekomme ich das Invoke für dne GUI Thread weg?? Ser Server läuft als Dienst oder CMD bei mir
-
ErfinderDesRades
Habe Frage an dich:
Und zwar füge ich die Clients einem ListView Item hinzu.
Jetzt würde ich diese Clients natürlich gerne auch wieder löschen, wenn
sie disposed werden.
Folgendes habe ich probiert:(Codeausschnitte)
'HelperClazz.GetAllClients liefert alle Clients vom Typ EasyClient (der TCPClient ist ein und derselbe wie aus der AllClientz Liste)
VB.NET-Quellcode
VB.NET-Quellcode
- Public MustInherit Class TCPBase : Implements IDisposable
- Private _IsDisposed As Boolean = False
- Public Event Disposed As EventHandlerEx(Of TCPBase)
- Protected MustOverride Sub Dispose(disposing As Boolean)
- Public MustOverride Sub Send(Msg As String)
- Public MustOverride Sub Send(Msg As Byte)
- Public Event StatusMessage As EventHandler(Of NotifyEventArgs(Of String))
- Public Event IndividRemove As EventHandler(Of NotifyEventArgs(Of TcpClient))
- Protected Sub IndividRe(se As TcpClient)
- RaiseEvent IndividRemove(Me, New NotifyEventArgs(Of TcpClient)(se))
- End Sub
VB.NET-Quellcode
- #Region "_Clients-Ereignisverarbeitung"
- Private Sub Client_Disposed(Sender As TCPBase)
- 'den Client für die beendete Verbindung entfernen
- IndividRe(HelperClazz.GetAllClients.ToList.SingleOrDefault(Function(w) w.Equals(Sender)).TC)
- Sender.RemoveFrom(AllClientz)
- Sender.RemoveFrom(HelperClazz.AllClient)
- End Sub
- #End Region
Kannst Du mir dazu etwas hilfe geben? -
"Sender.RemoveFrom(AllClientz)
Sender.RemoveFrom(HelperClazz.AllClient)"
Bitte nicht!
Da ich bei deinem Code grade nicht so dürchblicke kann ich dir leider nicht helfen.
MfG
Edit: Wieso überhaupt ein Listview ? Verwende doch ein Datagridview, pracktisch die Liste vom Server direkt mit dem Control verbinden, dann wird der Client beim Disposen automatisch ausm GUI entfernt.
Edit1: Da war wohl Jemand schneller
Die Farbe "Rot" ist der Moderation vorbehalten -> Farbe geändert. ~Thunderbolt
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „schockerjo“ ()
-
Daniel Baumert schrieb:
Und zwar füge ich die Clients einem ListView Item hinzu.
Einem Listview kannst du nur Strings zufügen.
Ich weiß nicht, welchen Datentyp deine Clients haben aber ich gehe mal davon aus: nicht String.
(Meinst du übrigensListView
oderListViewItem
?)
-
Das ist klar..
Ich bin jetzt ein Stück weiter gekommen, aber irgendwas scheitert am Event Raise.
In TCPBase habe ich Folgendes:
VB.NET-Quellcode
- Public Class NotifyEventArgs(Of T) : Inherits EventArgs
- Public ReadOnly Value As T
- Public Sub New(Value As T)
- MyBase.New()
- Me.Value = Value
- End Sub
- End Class
- Public Event IndividRemove As EventHandler(Of NotifyEventArgs(Of TcpClient))
- Protected Sub IndividRe(se As TcpClient)
- Throw New Exception("yeah")
- RaiseEvent IndividRemove(Me, New NotifyEventArgs(Of TcpClient)(se))
- End Sub
EndRead sieht wie folgt aus:
VB.NET-Quellcode
- Private Sub EndRead(ar As IAsyncResult)
- If MyBase.IsDisposed Then Return
- Try
- If Not TC.Connected Then
- CrossThread.RunGui(AddressOf IndividRe, TC)
- CrossThread.RunGui(AddressOf OnConnectionLost)
- CrossThread.RunGui(AddressOf OnStatusMessage, Ste.Enc("CounterClient shut down"))
- CrossThread.RunGui(AddressOf MyBase.Dispose)
- Exit Sub
- End If
- Dim msg As String = RSt.EndInvoke(ar)
- CrossThread.RunGui(AddressOf OnChatMessage, msg)
- RSt.BeginInvoke(AddressOf EndRead, Nothing) 'asynchrone Rekursion
- Catch ex As EndOfStreamException
- CrossThread.RunGui(AddressOf OnStatusMessage, Ste.Enc("CounterClient shut down"))
- CrossThread.RunGui(AddressOf MyBase.Dispose)
- End Try
- End Sub
Empfangen:
VB.NET-Quellcode
Das "yeah" wird mir ausgegeben , das "receive" dagegen nicht,
was de facto heißt -> Der Protected Sub IndividRe wird zwar aufgerufen,
aber die darin enthaltene Codezeile
scheitert.
Kann mir dazu jemand was sagen?Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Daniel Baumert“ ()
-
-
Ich habs mit einem Client und einem Server getestet
und die Sache ist ja (Bezug auf Protected Sub IndividRe) : "yeah" wird mir ausgegeben
und ich habe auch "se" geprüft -> alles ok.
Das Event wird gar nicht erst ausgelöst!Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Daniel Baumert“ ()
-
Daniel Baumert schrieb:
Ich habs mit einem Client und einem Server getestet
Zeig mal den Code, wie du deren RemoveIndiv-Event behandelst.
Falls du nur mit einem Client testest ist in der Liste eben nur ein Client-Objekt drin.
-
Meinst Du das?
VB.NET-Quellcode
- Private Sub _ServerOrClient_IndividRemove(sender As Object, e As NotifyEventArgs(Of TcpClient)) Handles _ServerOrClient.IndividRemove
- 'Throw New Exception("received!")
- Dim t As String = (IPAddress.Parse(CType(e.Value.Client.RemoteEndPoint, IPEndPoint).Address.ToString())).ToString
- ListBox1.Items.Add(t)
- End Sub
-
-
Das hier:
Habe ich in der TCPBase Klasse.
Und das hier in der Client Klasse:
VB.NET-Quellcode
- Private Sub _ServerOrClient_IndividRemove(sender As Object, e As NotifyEventArgs(Of TcpClient)) Handles _ServerOrClient.IndividRemove
- 'Throw New Exception("received!")
- Dim t As String = (IPAddress.Parse(CType(e.Value.Client.RemoteEndPoint, IPEndPoint).Address.ToString())).ToString
- ListBox1.Items.Add(t)
- End Sub
Hab auch Folgendes probiert:
Da wird mir auch "step 1 ok" angezeigt, auch "se" ist richtig , aber das Event
IndividRemove wird nicht ausgelöst.
Ist das so nicht korrekt?
Der Server stellt doch grundlegend auch einen Client dar, nur dass er halt nebenbei noch
andere Clients annehmen kann und somit Server ist.Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Daniel Baumert“ ()
-
Du kannst in der Client-Klasse, und auch in der Tcp-Klasse und sonstwo - kannst du dich auf den Kopf stellen und mitte Zehen wackeln.
Wenn du im Server die Client-Events nicht behandelst, dann werden die Client-Events der Clients im Server halt nicht behandelt
Daniel Baumert schrieb:
Der Server stellt doch grundlegend auch einen Client dar, nur dass er halt nebenbei noch
andere Clients annehmen kann und somit Server ist.
Der Server ist im Wesentlichen ein TcpListener und eine Auflistung von Clients.
Ich habe dich jetzt 4 mal auf den Server hingewiesen - wie oft möchtest du's noch hören?
-
Ich habs doch jetzt auch schon paar Mal geschrieben...
Die Sache ist: ich habe einen Client gehabt und als der sich disconnected hat,
wurde Protected Sub IndividRe(se As TcpClient) doch aufgerufen!!!
ALSO KLAPPT DAS DOCH.
Das Einzige was nicht klappt, ist die Weiterleitung an das Event , das
im SELBEN SUB aufgerufen wird. -
-
VB.NET-Quellcode
- Public Class Server : Inherits TCPBase
- Private ListNa As TcpListener
- Private AllClientz As New List(Of Client)
- Public Sub New(EP As IPEndPoint)
- ListNa = New TcpListener(EP) With {.ExclusiveAddressUse = False}
- ListNa.Start()
- ListNa.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
- End Sub
- Private Sub EndAccept(ar As IAsyncResult)
- If MyBase.IsDisposed Then Return
- With New Client(ListNa.EndAcceptTcpClient(ar))
- AddHandler .ChatMessage, AddressOf Client_ChatMessage
- AddHandler .StatusMessage, AddressOf Client_StatusMessage
- AddHandler .Disposed, AddressOf Client_Disposed
- .AddTo(AllClientz)
- .AddTo(HelperClazz.AllClient)
- End With
- CrossThread.RunGui(AddressOf OnStatusMessage, Ste.Enc("TCPClient accepted"))
- ListNa.BeginAcceptTcpClient(AddressOf EndAccept, Nothing)
- End Sub
- #Region "_Clients-Ereignisverarbeitung"
- Private Sub Client_Disposed(Sender As TCPBase)
- 'den Client für die beendete Verbindung entfernen
- Sender.RemoveFrom(AllClientz)
- Sender.RemoveFrom(HelperClazz.AllClient)
- End Sub
- Private Sub Client_ChatMessage(sender As Object, e As NotifyEventArgs(Of String))
- 'Send(e.Value) Bei einem Client ankommende ChatMessages anzeigen und an alle anderen Clients senden
- OnStatusMessage(e.Value)
- End Sub
- Private Sub Client_StatusMessage(sender As Object, e As NotifyEventArgs(Of String))
- 'einkommende StatusMessages durchreichen (zur Anzeige)
- OnStatusMessage(e.Value)
- End Sub
- #End Region
- Public Overrides Sub Send(Msg As String)
- 'OnChatMessage(Msg) ' Server soll Eigene Nachrichten anzeigen
- Parallel.ForEach(AllClientz, Sub(w As Client) w.Send(Msg))
- End Sub
- Public Overrides Sub Send(Msg As Byte)
- 'OnChatMessage(Msg) ' Server soll Eigene Nachrichten anzeigen
- Parallel.ForEach(AllClientz, Sub(w As Client) w.Send(Msg))
- End Sub
- Protected Overrides Sub Dispose(disposing As Boolean)
- ListNa.Stop()
- For i As Integer = AllClientz.Count - 1 To 0 Step -1
- AllClientz(i).Dispose()
- Next
- End Sub
- End Class
Ich benötige ein Event, dass ich in Public Class Form1 (also der Klasse von der WinForm) nutzen kann.
Dieses Event soll den TCPClient enthalten.
Dann sag mir doch bitte, wie man das konkret umsetzen kann.
Es soll dann ausgelöst werden, wenn ein Client disposed wird.
-
Ähnliche Themen
-
11 Benutzer haben hier geschrieben
- J.Herbrich (24)
- ErfinderDesRades (23)
- Gast (16)
- schockerjo (5)
- Manawyrm (4)
- ThuCommix (2)
- Rootbob91 (2)
- nikeee13 (2)
- Quadsoft (1)
- n1nja (1)
- hal2000 (1)