Hallo,
ich suche seit einigen Tagen nach einer Möglichkeit, um bei einer TCP Verbindung ein "Feedback" - sprich einen String - vom Server zu Client zurück zu senden.
Kann mir da jemand weiter helfen?
Danke
Hallo,
ich suche seit einigen Tagen nach einer Möglichkeit, um bei einer TCP Verbindung ein "Feedback" - sprich einen String - vom Server zu Client zurück zu senden.
Kann mir da jemand weiter helfen?
Danke
- Verbindung aufbauen
- Client: TCPSend(Msg) ; wenn darauf eine Antwort erwartet wird, wechseln zu: TCPRecv()
- Server: TCPRecv() ; je nach erhaltener Nachricht reagieren und Nachricht senden: TCPSend(Msg)
Natürlich in entsprechenden Schleifen, unbedingt einen "Notausgang" integrieren, falls Verbindungsabbruch entsteht und du nicht in eine Endlosschleife läufst.
Bastele dir am Besten ein eigenes Protokoll, damit du beim Senden ankündigst, was du sendest und welche Reaktion erwartet wird, z.B.
LEN-38;EXPECT-ANSWER;MSG-Die Nachricht
Vielen dank @BugFix vom Prinzip her verstanden. Ich habe das auch so ähnlich schon probiert. Aber hättest du ein Beispielscript? Danke
Aber hättest du ein Beispielscript?
Nein, TCP mache ich äusserst selten. In der Form hatte ich es in AutoIt noch gar nicht, aber in Python. Aber poste doch mal deine Versuche, dann kann man sehen, wo die Säge klemmt.
$Port = 8745
$ServerIP = @IPAddress1
$ClientIP = "192.168.1.38"
TCPStartup()
$MainSocket = TCPListen($ServerIP, $Port)
If $MainSocket = -1 Then
MsgBox(16,"Fail","Server ist bereits Gestartet!")
Exit
EndIf
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
While 1
$recv = TCPRecv($ConnectedSocket, 2048)
If $recv <> "" Then
_CommandToActive($recv)
EndIf
WEnd
Func _CommandToActive($command)
$ar = StringSplit($command,",")
Switch $ar[1]
Case "Msg"
SplashTextOn($ar[2],$ar[3],400,180,-1 ,-1, 0, "Consolas", 14)
TCPSend($ClientIP, "Feedback-MessageGesendet")
EndSwitch
EndFunc
Alles anzeigen
So müsste ja eigentlich "Feedback-MessageGesendet" an den Client zurückgesendet werden... @BugFix
Hi,
hast du dir mal die hilfe zu TCPSend() angeschaut? Und dessen Parameter?
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=testserv.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
$Port = 8745
$ServerIP = @IPAddress1
$ClientIP = "192.168.1.38"
TCPStartup()
$MainSocket = TCPListen($ServerIP, $Port)
If $MainSocket = -1 Then
MsgBox(16,"Fail","Server ist bereits Gestartet!")
Exit
EndIf
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
$BackSocket = TCPConnect($ClientIP, $Port +10)
While 1
$recv = TCPRecv($ConnectedSocket, 2048)
If $recv <> "" Then
_CommandToActive($recv)
EndIf
WEnd
Func _CommandToActive($command)
$ar = StringSplit($command,",")
Switch $ar[1]
Case "Msg"
SplashTextOn($ar[2],$ar[3],400,180,-1 ,-1, 0, "Consolas", 14)
TCPSend($BackSocket, "Feedback-MessageGesendet")
EndSwitch
EndFunc
Alles anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=testcli.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
$Port = 8745
$ServerIP = "192.168.1.107"
$ClientIP = @IPAddress1
TCPStartup()
$Mainsocket = TCPConnect($ServerIP, $Port)
$BackSocket = TCPListen($ServerIP, $Port + 10)
If $BackSocket = -1 Then
MsgBox(16,"Fail","Backsocket geht nicht!")
Exit
EndIf
$ConnectedBackSocket = -1
Do
$ConnectedBackSocket = TCPAccept($BackSocket)
Until $ConnectedBackSocket <> -1
TCPSend($Mainsocket,"Msg,Info,Dies ist ein Informationstext!")
$recv = ""
While $recv <> ""
$recv = TCPRecv($ConnectedBackSocket, 2048)
If $recv <> "" Then
_CommandToActive($recv)
EndIf
WEnd
Func _CommandToActive($command)
$ar = StringSplit($command,",")
Switch $ar[1]
Case "Feedback-MessageGesendet"
MsgBox(0,"ANTWORT","Antwort vom Server!")
EndSwitch
EndFunc
Alles anzeigen
So. Ich habe das jz nochmal überarbeitet, aber ich komme immer noch nicht weiter @BugFix & @Andy
Keine Ahnung was du da machst. Wieso hast du in beiden Scripten Server und Client code? Für eine einfache Kommunikation reicht es völlig wenn es einen Server gibt und der bzw. die Clients sich mit diesem verbinden. Das was du hier versuchst ist dann schon eher P2P und wird in der Praxis nicht funktionieren wenn du nicht auf allen beteiligten Geräten statische IPs verwendest. Bei dynamischer IP Zuweisung bräuchtest du für sowas noch eine zentrale Stelle die dir die aktuellen IP Adressen verrät.
Ohne deine Scripte nun besonders genau angeschaut zu haben könnte ich mir auch vorstellen, dass du ein Timing Problem hast. Sprich dein Client sendet etwas bevor der Server überhaupt bereit ist Antworten anzunehmen/auszuwerten.
Fang nochmal ganz von vorne an und bau dir eine kleine GUI für den Server und den Client über die du den Verbindungsaufbau und das Senden manuell auslösen kannst. (kleiner chat client, welcher automatische antworten vom server bekommt)
So kannst du deinen code in beiden Scripten prüfen und besser verstehen was da eigentlich passiert.
Achja und du solltest am Server Computer prüfen ob evtl. eine Firewall oder Antivirenlösung dein Serverscript blockiert.
Hier nochmal der ungefähre Aufbau der Scripte:
; Server-Script
$mainsocket=TCPlisten(...)
do
$clientsocket=TCPaccept($mainsocket)
until $clientsocket <> -1 ;.... 1 client hat sich verbunden
; wenn du mehr als eine client verbindung willst musst du die client sockets in einem Array
; speichern und TCPaccept permanent aufrufen
while 1
$msg=TCPrecv($clientsocket) ; auf nachricht vom client prüfen
checkclientmessage($msg) ; nachricht prüfen und antworten
wend
func checkclientmessage($msg)
;...
tcpsend($clientsocket) ; antwort an client schicken
;...
endfunc
Alles anzeigen
; Client-Script
$serversocket=TCPconnect(...)
while 1
$msg=TCPrecv($serversocket) ; auf nachricht vom server prüfen, z.B. "hallo du bist verbunden"
checkservermessage($msg) ; nachricht prüfen und antworten
;... zum testen könntest du nun deine client gui überwachen und je nach benutzer aktion dinge an den server schicken, sofern der server etwas damit anfangen kann antwortet er dir
wend
func checkservermessage($msg)
;...
tcpsend($serversocket) ; automatische antwort an server schicken, z.B. "mein name ist"
;...
endfunc
Alles anzeigen
Achja und ganz wichtig noch... sorge dafür, dass die sockets beim Verbindungsende/abbruch geschlossen werden tcpcloseSocket() und bei Programmende ein tcpshutdown(). Andernfalls kann es passieren, dass deine verwendeten Ports nicht mehr nutzbar sind und weitere Tests dadurch scheitern.
Oh :D. Warum einfach wenn es auch Kompliziert geht würde ich mal sagen Vielen Dank @misterspeed . Funktioniert genau so, wie ich mir das vorgestellt habe Auch an die anderen - Danke