Nachricht an TS3 Server senden

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Drachie.

    Nachricht an TS3 Server senden

    Hallo liebes VB- Paradise Team,
    Ich weiß dieses Theama wurden in den Vergangenen Jahren mehrmals beschrieben. Dennoch hab ich ein Problem.
    Ich besitze einen gehosteten Ts3 Server und möchte per Button Click aus meiner windows Form eine nachricht an den Server senden.
    Code:

    VB.NET-Quellcode

    1. Dim tcpClient As New System.Net.Sockets.TcpClient()
    2. tcpClient.Connect("xxxxxxxxx", "9001")
    3. Dim networkStream As Sockets.NetworkStream = tcpClient.GetStream()
    4. Dim sendBytes As [Byte]()
    5. sendBytes = Encoding.ASCII.GetBytes("login Leitstelle (PW)" + vbCrLf)
    6. networkStream.Write(sendBytes, 0, sendBytes.Length)
    7. sendBytes = Encoding.ASCII.GetBytes("use sid=1" + vbCrLf)
    8. networkStream.Write(sendBytes, 0, sendBytes.Length)
    9. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=[b][Color=red][LEITSTELLE]:\s\s\ + vbCrLf")
    10. networkStream.Write(sendBytes, 0, sendBytes.Length)
    11. sendBytes = Encoding.ASCII.GetBytes("logout" + vbCrLf)
    12. networkStream.Write(sendBytes, 0, sendBytes.Length)
    13. If Not networkStream.CanRead Then
    14. Console.WriteLine("cannot not write data to this stream")
    15. tcpClient.Close()
    16. Else
    17. If Not networkStream.CanWrite Then
    18. Console.WriteLine("cannot read data from this stream")
    19. tcpClient.Close()
    20. End If
    21. End If
    22. ' pause so user can view the console output
    23. Console.ReadLine()


    Folgende Fehler Meldung erhalte ich:

    VB.NET-Quellcode

    1. Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte


    Ebenfalls hab ich es mit einem localhost Ts3 versucht weil es hätte ja sein können das es an meinem Ts3 Anbieter liegt aber dort kommt folgende Fehlermeldung:

    VB.NET-Quellcode

    1. {"Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat xxxxx"}


    Danke im Voraus für alle Antworten
    Danke für deine schnelle Antwort @EaranMaleasi aber wieso müsste ich den Port freigeben der Server läuft doch theoretisch gesehen nicht über mich?

    EDIT: Port ist freigegeben dennoch kommt die Fehlermeldung

    VB.NET-Quellcode

    1. Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte

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

    Wenn ich dich recht verstehe, hast du doch versucht, dich zu einer lokalen Serverinstanz von TS3 zu verbinden, oder?

    Daher bin ich davon ausgegangen, dass der Server auch von dir verwaltet wird. Da du aber "gehostet" schreibst gehe ich nun davon aus, dass du wohl mit dem Server auf dem der TS betrieben wird, wohl wenig zu tun hast. Daher ist das mit der Firewall wohl irrelevant

    Eine andere Frage die ich mir stelle, wieso benutzt du nicht z.B. diese Bibliothek:
    github.com/TeamSpeak-Systems/ts3_sdk_dotNet

    anstatt selbst die Verbindung von Hand zusammenzuflicken.
    @EaranMaleasi Ja er wird gehostet von einem Anbieter da es aber nicht geklappt hat wollte ich es auf einem Localhost versuchen. Es soll aber auf meinen Ts3 klappen der gehostet wird (für den ich monatlich bezahle). Ich hab in anderen Threads gesehen in diesem Forum das es mit dem gleichen Code bei ihnen klappt nur bei mir nicht :( . Und ich kenne mich recht wenig mit solchen Bibilotheken aus deswegen wollte ich es mit dem Code versuchen.

    Jan112 schrieb:

    VB.NET-Quellcode

    1. sendBytes = Encoding.ASCII.GetBytes("login Leitstelle (PW)" + vbCrLf)
    2. networkStream.Write(sendBytes, 0, sendBytes.Length)
    Mach mal aus diesen Zeilen-Paaren ein separates Unterprogramm.
    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!
    @Jan112 So was:

    VB.NET-Quellcode

    1. Private Sub SendBytes(message As String)
    2. Dim sendBytes = Encoding.ASCII.GetBytes(message & vbCrLf)
    3. networkStream.Write(sendBytes, 0, sendBytes.Length)
    4. End Sub
    Aufruf:

    VB.NET-Quellcode

    1. SendBytes("login Leitstelle (PW)")
    2. SendBytes("use sid=1")
    3. ' ...

    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!
    @Jan112 OMG
    So was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Using tcpClient As New System.Net.Sockets.TcpClient()
    3. tcpClient.Connect("xxxxxxxxx", 9001)
    4. Dim networkStream As Sockets.NetworkStream = tcpClient.GetStream()
    5. SendBytes("login Leitstelle (PW)", networkStream)
    6. SendBytes("use sid=1", networkStream)
    7. SendBytes("sendtextmessage targetmode=3 target=1 msg=[b][Color=red][LEITSTELLE]:\s\s\", networkStream)
    8. SendBytes("logout", networkStream)
    9. If Not networkStream.CanRead Then
    10. Console.WriteLine("cannot not write data to this stream")
    11. ElseIf Not networkStream.CanWrite Then
    12. Console.WriteLine("cannot read data from this stream")
    13. End If
    14. End Using
    15. End Sub
    16. Private Sub SendBytes(message As String, networkStream As Sockets.NetworkStream)
    17. Dim sendBytes = Encoding.ASCII.GetBytes(message & vbCrLf)
    18. networkStream.Write(sendBytes, 0, sendBytes.Length)
    19. End Sub
    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!

    Jan112 schrieb:

    Klappt leider nicht
    Was klappt nicht?
    Ist Dir wenigstens der Fehler in Zeile 9 Deines Codes aufgefallen?
    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 hatte damals das gleiche Problem gehabt und nach wälzen der API Referenzen zum TS³ habe ich dann folgendes geschrieben was funktioniert:


    VB.NET-Quellcode

    1. Private Sub ts3_alarm()
    2. Dim server As String = "Server-ip"
    3. Dim port As String = "Default TS³-queryport"
    4. Dim benutzer As String = "TS³-queryuser"
    5. Dim pw As String = "TS³-Query kennwort"
    6. Dim sid As String = "TS³-serverID"
    7. Dim tsClient As New System.Net.Sockets.TcpClient()
    8. Dim networkStream As NetworkStream = tsClient.GetStream()
    9. Dim sendBytes As Byte()
    10. Dim unformatwache As String = ric.Text
    11. Dim formatwache As String = unformatwache.Replace(" ", "\s")
    12. Dim sendenderwache As String = formatwache.Replace(";Ende", "")
    13. Dim EArt2 As String = Replace(eart, " ", "\s")
    14. Dim AString As String = Replace(strasse & " - " & schaden, " ", "\s")
    15. Dim BString As String = Replace(Ort.Text, " ", "\s")
    16. tsClient.Connect(server, port)
    17. sendBytes = Encoding.ASCII.GetBytes("login" & " " & benutzer & " " & pw + vbCrLf)
    18. networkStream.Write(sendBytes, 0, sendBytes.Length)
    19. sendBytes = Encoding.ASCII.GetBytes("use sid=" & sid + vbCrLf)
    20. networkStream.Write(sendBytes, 0, sendBytes.Length)
    21. sendBytes = Encoding.ASCII.GetBytes("clientupdate client_nickname=Leitstelle" + vbCrLf)
    22. networkStream.Write(sendBytes, 0, sendBytes.Length)
    23. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=[b][Color=red]EINSATZALARM" + vbCrLf)
    24. networkStream.Write(sendBytes, 0, sendBytes.Length)
    25. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=Einsatznummer:\s" & enrid.Text & "" + vbCrLf)
    26. networkStream.Write(sendBytes, 0, sendBytes.Length)
    27. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=Einsatz:\s" & sendenderwache & "" + vbCrLf)
    28. networkStream.Write(sendBytes, 0, sendBytes.Length)
    29. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=Art:\s" & EArt2 & "" + vbCrLf)
    30. networkStream.Write(sendBytes, 0, sendBytes.Length)
    31. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=Meldung:\s" & AString & "" + vbCrLf)
    32. networkStream.Write(sendBytes, 0, sendBytes.Length)
    33. sendBytes = Encoding.ASCII.GetBytes("sendtextmessage targetmode=3 target=1 msg=Ort:\s" & BString & "" + vbCrLf)
    34. networkStream.Write(sendBytes, 0, sendBytes.Length)
    35. sendBytes = Encoding.ASCII.GetBytes("logout" + vbCrLf)
    36. networkStream.Write(sendBytes, 0, sendBytes.Length)
    37. End Sub


    Mittlerweile weis ich auch das man kennwörter und co nicht gerade in sen Quellcode reinprogrammiert sollte. der obere codeschnipsel ist gut und gerne 4 jahre als und läuft immer noch mit einem TS³

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

    Frage deinen hoster danach. für das Senden von Nachrichten an einen TS³ mrauchst du auf jedenfall die Query zugangsdaten. ansonsten kannst du das ganze vergessen
    dann musst du nur deine Server ID noch rausfinden und das geht über den Client:

    rechtklick auf dem servernamend und dann Virtuellen Server deitieren. da konnte man die Server Id auslesen drüber. wenn das nicht möglich ist, deinen Hoster kontakten damit er dir die Server ID mitteilt
    @Jan112 du scheinst da etwas bauen zu wollen und hast dir nicht einmal die Dokumentation der ServerQuery angeschaut oder?

    Denn dort steht ganz klar drin das du für den "use" Befehl auch den Port deines Virtuellen Servers nutzen kannst.

    Also: use port=XXXX

    Die Doku dazu findest du wenn du dir den aktuellen Server Release runterlädst im "serverquerydocs" Ordner.

    Auszug aus den Docs:
    Spoiler anzeigen

    Quellcode

    1. Usage: use [sid={serverID}] [port={serverPort}] [-virtual] [client_nickname={nickname}]
    2. use {serverID} [-virtual] [client_nickname={nickname}]
    3. Permissions:
    4. b_virtualserver_select
    5. Description:
    6. Selects the virtual server specified with sid or port to allow further
    7. interaction. The ServerQuery client will appear on the virtual server and
    8. acts like a real TeamSpeak 3 Client, except it's unable to send or receive
    9. voice data.
    10. If your database contains multiple virtual servers using the same UDP port,
    11. use will select a random virtual server using the specified port.
    12. Example:
    13. use sid=1
    14. error id=0 msg=ok
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

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