Nachricht Senden von Server zu Client Problem

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Nachricht Senden von Server zu Client Problem

    Hallo,
    habe da folgendes Problem:
    Der Client kann ganz normal eine Verbindung zum Server aufbauen, und auch Nachrichten Schicken. (Server ist basierend auf dem Code stackoverflow.com/questions/14…nects-after-several-hours).

    Allerdings kann ich keine Nachrichten an den Client Schicken, der Server schickt zwar nach jeder Empfangenen Nachricht eine Antwort an den Client das es Empfangen wurde, aber aktiv lässt sich keine Nachricht abschicken.

    Die Class hat den Code:

    Quellcode

    1. Public Class ConnectionInfo
    2. 'hold a reference to entire monitor instead of just the listener
    3. Private _Monitor As MonitorInfo
    4. Public ReadOnly Property Monitor As MonitorInfo
    5. Get
    6. Return _Monitor
    7. End Get
    8. End Property
    9. Private _Client As TcpClient
    10. Public ReadOnly Property Client As TcpClient
    11. Get
    12. Return _Client
    13. End Get
    14. End Property
    15. Private _Stream As NetworkStream
    16. Public ReadOnly Property Stream As NetworkStream
    17. Get
    18. Return _Stream
    19. End Get
    20. End Property
    21. Private _DataQueue As System.Collections.Concurrent.ConcurrentQueue(Of Byte)
    22. Public ReadOnly Property DataQueue As System.Collections.Concurrent.ConcurrentQueue(Of Byte)
    23. Get
    24. Return _DataQueue
    25. End Get
    26. End Property
    27. Private _LastReadLength As Integer
    28. Public ReadOnly Property LastReadLength As Integer
    29. Get
    30. Return _LastReadLength
    31. End Get
    32. End Property
    33. 'The buffer size is an arbitrary value which should be selected based on the
    34. 'amount of data you need to transmit, the rate of transmissions, and the
    35. 'anticipalted number of clients. These are the considerations for designing
    36. 'the communicaition protocol for data transmissions, and the size of the read
    37. 'buffer must be based upon the needs of the protocol.
    38. Private _Buffer(63) As Byte
    39. Public Sub New(ByVal monitor As MonitorInfo)
    40. _Monitor = monitor
    41. _DataQueue = New System.Collections.Concurrent.ConcurrentQueue(Of Byte)
    42. End Sub
    43. Public Sub AcceptClient(ByVal result As IAsyncResult)
    44. _Client = _Monitor.Listener.EndAcceptTcpClient(result)
    45. If _Client IsNot Nothing AndAlso _Client.Connected Then
    46. _Stream = _Client.GetStream
    47. End If
    48. End Sub
    49. Public Sub AwaitData()
    50. _Stream.BeginRead(_Buffer, 0, _Buffer.Length, AddressOf DoReadData, Me)
    51. End Sub
    52. Private Sub DoReadData(ByVal result As IAsyncResult)
    53. Dim info As ConnectionInfo = CType(result.AsyncState, ConnectionInfo)
    54. Try
    55. 'If the stream is valid for reading, get the current data and then
    56. 'begin another async read
    57. If info.Stream IsNot Nothing AndAlso info.Stream.CanRead Then
    58. info._LastReadLength = info.Stream.EndRead(result)
    59. For index As Integer = 0 To _LastReadLength - 1
    60. info._DataQueue.Enqueue(info._Buffer(index))
    61. Next
    62. 'The example responds to all data reception with the number of bytes received;
    63. 'you would likely change this behavior when implementing your own protocol.
    64. info.SendMessage("Received " & info._LastReadLength & " Bytes")
    65. For Each otherInfo As ConnectionInfo In info.Monitor.Connections
    66. If Not otherInfo Is info Then
    67. otherInfo.SendMessage(System.Text.Encoding.ASCII.GetString(info._Buffer))
    68. End If
    69. Next
    70. info.AwaitData()
    71. Else
    72. 'If we cannot read from the stream, the example assumes the connection is
    73. 'invalid and closes the client connection. You might modify this behavior
    74. 'when implementing your own protocol.
    75. info.Client.Close()
    76. End If
    77. Catch ex As Exception
    78. info._LastReadLength = -1
    79. End Try
    80. End Sub
    81. Public Sub SendMessage(ByVal message As String)
    82. If _Stream IsNot Nothing Then
    83. Dim messageData() As Byte = System.Text.Encoding.ASCII.GetBytes(message)
    84. Stream.Write(messageData, 0, messageData.Length)
    85. End If
    86. End Sub
    87. End Class


    Nun mache ich in der Form1 Class einen Testbutton mit Folgendem Code:

    Quellcode

    1. Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
    2. Dim CInfo As ConnectionInfo
    3. CInfo.SendMessage("Test")
    4. End Sub


    Jetzt kommt der Fehler:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Darunter dann die Info das ich über New eine neue Erstellen kann.

    Wenn ich allerdings mit

    Quellcode

    1. Dim CInfo As New ConnectionInfo


    probiere kommt garnix beim Client an.

    hasexxl1988 schrieb:

    aber aktiv lässt sich keine Nachricht abschicken.
    Das ist das Wesen eines Servers.
    Ein Client meldet sich an und dann geht es hin und her. Der Client weiß doch gar nicht, dass der Server was von ihm will, insbesondere dann nicht, wenn er einen Sack voll Berechnungen durchzuführen hat.
    Wenn er es weiß, kann er ja den Server antriggern, z.B. über einen Timer.
    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!
    @ErfinderDesRades Jou.
    Aber der Client ist nicht mit Fouriertransformation und solch beschäftigt, sondern mit Chatten, also er weiß, dass da was kommen kann.
    Und genau das ist im Fall von @hasexxl1988 nicht der Fall.
    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!
    Den Zusammenhang mitte Fouriertransformation krieg ich grad nicht auf Reihe, aber das hier verstehe ich:

    RodFromGermany schrieb:

    also er (der Client) weiß, dass da was kommen kann
    Und da wäre mein Ansatz halt, dass ein Client sich registrieren muss beim Server - sonst kanner natürlich nix empfangen.
    Im Falle TcpClient bedeutet "Registrierung", dass TcpClient.Connect() auszuführen ist (in richtiger Weise, und erfolgreich) - jo und davon kann ich in des TEs Code nix finden.
    Und deshalb scheint sein _Stream auch Nothing zu sein (s. Post#2).

    ErfinderDesRades schrieb:

    und davon kann ich in des TEs Code nix finden.
    Jou.
    Er verweist da auf einen stackoverflow-Code. Da sehe ich ausnahmsweise mal nicht rein.
    @hasexxl1988 Ich halte mich da an Bill.
    Asynchrone Clientsockets
    Asynchroner Serversocket.
    Die sind beide aufeinander abgestimmt.
    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!
    Ich würde empfehlen, durchaus bei TcpClient und TcpListener zu bleiben.
    Socket ist afaik dazu designed, auch gänzlich annere Protokolle als TCP zu bedienen, daher kann man da viel mehr falsch machen als mit den auf Tcp spezialisierten Klassen.

    Na, vlt. auch nicht. Den MDSN-Code kanner vlt. einpasten ohne was zu verstehen, und mit Glück funztes dann auch.
    Für TcpListener/Client weiß ich grad kein Msdn-Beispiel, obwohl durchaus denkbar, dasses das auch gibt.

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

    Als Client wird eine Android App verwendet, wüsste nicht auf die schnelle wie ich die Umstellen könnte auf das Client Example das oben verwendet wurde.

    Dachte nur nachdem der Server eine Automatische Antwort Sendet ala "Es wurden XX Bytes Empfangen" und die Nachricht beim Client auch ankommt das man diese Sende Funktion für Nachrichten vom Server zum Client auch nutzen kann.

    hasexxl1988 schrieb:

    Android App
    Wann hatest Du vor, uns das mitzuteilen? Diese Information gehört in den Eröffnungspost :!:
    Wer schreibt dieses Programm / hat die Quellen davon?
    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!
    @hasexxl1988 OK.
    Mit Android hab ich nix am Hut, hab auch keine Gegenstelle zum Testen.
    In welcher Sprache programmierst Du für den Androiden? ( :thumbsup: )
    Ist das CrossCompile?
    Kann man da Debug-Ausgaben reinbringen?
    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!