Hallo Franz,
zuerst habe ich habe den Thread-Kram rausgeschmissen und auf Timer umgestellt - hat nicht funktioniert.
Dann alle Varianten für das Senden getestet (:SendLine(), SendLineTo(), SendRaw(), ...). Die Rückmeldung auch mit dem Debugger zu den Methoden war immer 'Successful' - im EchoServer ist aber immer nur die erste Zeile angekommen. Auch mit dem Debugger nix gefunden.
Der VO-EchoClient erstellt für jede Nachricht ein neues Objekt oSocket, sendet dann mit :SendLineTo() und zerstört das Objekt wieder mit :Axit(). Anscheinend funktioniert der EchoServer nur so richtig.
Ich habe dann einen anderen EchoServer gesucht. Dort sind dann alle Nachrichten mit :SendLine() - und auch mit allen anderen Send-Methoden sofort angekommen. Auch eine #ENDE-Nachricht wird noch gesendet.
Das ist der SocketTest, mit dem ich getestet habe: sockettest.sourceforge.net/
Der SocketTest antwortet leider nicht autom.mit den gesendeten Nachrichten. Alle mit 'Send' gesendeten Texte sind aber im VO-Fenster angekommen. Das funktioniert also auch mit einem Timer und ist einfacher und übersichtlicher als mit einem Thread.
Das Problem liegt also wohl nicht an dem :SendTo() in Deiner Anwendung.
HTH
Gerhard Bunzel
SerialLib Klasse für VO 2.8
Moderator: wriedmann
-
- Posts: 97
- Joined: Tue Mar 01, 2016 11:50 am
- Location: Germany
SerialLib Klasse für VO 2.8
- Attachments
-
- SocketTest.jpg (59.4 KiB) Viewed 467 times
SerialLib Klasse für VO 2.8
Hallo Gerhard,
danke für deine Bemühungen! Dass der Echo Client immer wieder einen neuen Socket öffnet habe ich in Msg #22844 auch bemerkt und geschrieben.
Inzwischen habe ich den Echo Server und den Echo Client so umgebaut, dass diese die gewünschte Kommunikation bidirektional abwickeln. Wegen dem Thread ist einiges an Absicherungen und Abfragen notwendig, damit dies vernünftig funktioniert. Ich schau mir mal an wie es mit Timer funktioniert, beim Kunden wird irgendwann mal auf eine neue Hardware umgestellt, vielleicht kann ich dann das Prog dabei mit umstellen.
Ablauf für einen Test:
- CrdServer mit Button Start aktivieren
- CrdClient mit Button Start Kommunikation aktivieren
- Im CrdServer mit den 3 Buttons Eingang, Ausgang, Nacht das Einstecken von Karten simulieren
danke für deine Bemühungen! Dass der Echo Client immer wieder einen neuen Socket öffnet habe ich in Msg #22844 auch bemerkt und geschrieben.
Inzwischen habe ich den Echo Server und den Echo Client so umgebaut, dass diese die gewünschte Kommunikation bidirektional abwickeln. Wegen dem Thread ist einiges an Absicherungen und Abfragen notwendig, damit dies vernünftig funktioniert. Ich schau mir mal an wie es mit Timer funktioniert, beim Kunden wird irgendwann mal auf eine neue Hardware umgestellt, vielleicht kann ich dann das Prog dabei mit umstellen.
Ablauf für einen Test:
- CrdServer mit Button Start aktivieren
- CrdClient mit Button Start Kommunikation aktivieren
- Im CrdServer mit den 3 Buttons Eingang, Ausgang, Nacht das Einstecken von Karten simulieren
SerialLib Klasse für VO 2.8
Hab gesehen, dass die CrdClient Antworten WITHDRAW und EJECT beim CrdServer wieder nicht ankommen. Ist mir aber jetzt egal, der unbezahlte Aufwand dafür wird mir nun zu groß.
Danke für euren Input!
PS Gerhard: Wie würde das mit dem Timer funktionieren - Wenn der Timer anspringt, Socket öffnen, schauen ob eine Nachricht vorliegt, Socket schließen? Oder welchen Ablauf hattest du im Timer?
Danke für euren Input!
PS Gerhard: Wie würde das mit dem Timer funktionieren - Wenn der Timer anspringt, Socket öffnen, schauen ob eine Nachricht vorliegt, Socket schließen? Oder welchen Ablauf hattest du im Timer?
-
- Posts: 97
- Joined: Tue Mar 01, 2016 11:50 am
- Location: Germany
SerialLib Klasse für VO 2.8
Hab die Test-App schon gelöscht. Das mit dem Timer ist aber recht einfach.
Wenn die Connection gestartet wird, auch den Timer starten. Vorher kann es ja noch keine Nachrichten geben:
SetTimer (SELF:handle (), 2000, 500, NULL_PTR)
Im Dispatcher des Fenster dann auf die Timernachricht warten und oSocket so abarbeiten, wie im Thread:
METHOD Dispatch (oEvent) CLASS MyWindow
LOCAL oEvt AS @@Event
oEvt := oEvent
DO CASE
CASE oEvt:message == WM_Timer
DO CASE
CASE oEvt:wParam == 2000 // ID des Timers
cLine := SELF:_oSocket:GetLine()
........
ENDCASE
ENDCASE
RETURN SUPER:Dispatch (oEvt)
Wenn die Connection beendet wird auch den Timer beenden:
KillTimer (SELF:handle (), 2000)
HTH
Gerhard Bunzel
Wenn die Connection gestartet wird, auch den Timer starten. Vorher kann es ja noch keine Nachrichten geben:
SetTimer (SELF:handle (), 2000, 500, NULL_PTR)
Im Dispatcher des Fenster dann auf die Timernachricht warten und oSocket so abarbeiten, wie im Thread:
METHOD Dispatch (oEvent) CLASS MyWindow
LOCAL oEvt AS @@Event
oEvt := oEvent
DO CASE
CASE oEvt:message == WM_Timer
DO CASE
CASE oEvt:wParam == 2000 // ID des Timers
cLine := SELF:_oSocket:GetLine()
........
ENDCASE
ENDCASE
RETURN SUPER:Dispatch (oEvt)
Wenn die Connection beendet wird auch den Timer beenden:
KillTimer (SELF:handle (), 2000)
HTH
Gerhard Bunzel
- softdevo@tiscali.it
- Posts: 191
- Joined: Wed Sep 30, 2015 1:30 pm
SerialLib Klasse für VO 2.8
I used this code, I hope it still works
Danilo Giuliani
Danilo Giuliani
- Attachments
-
- Serial.zip
- (8.26 KiB) Downloaded 92 times
SerialLib Klasse für VO 2.8
Hi Danilo,
thank you for the code, but I already got it from Wolfgang.
Franz
thank you for the code, but I already got it from Wolfgang.
Franz