Socket-Kommunikation

27/05/2008 - 11:23 von akl | Report spam
Hallo zusammen,

Ich versuche gerade mit einem Server per Socket zu kommunizieren. Da ich damit
jedoch nicht wirklich Erfahrung habe, hoffe ich das Ihr mir weiterhelfen könnt.

Folgendes Szenario:
Ich habe einen speziellen Server, an den ich per Socket Befehle schicke und als
Antwort(en) eine, bzw. mehrere Zeilen zurückbekomme. Verschiedene Schlüsselworte
in den Antworten an sich, sind Situationsabhàngig und bekannt. Die Reihenfolge
der Antworten ebenso.

Ein Beispiel:
# Verbindung zum Java-Server aufbauen
client = TCPSocket.open(@prefs['java_host'], @prefs['java_port'])

while answer = client_to_close.gets
if answer.include?('STRING_A::')
client.puts("IDENT::#{identifikationsstring}")
while answer2 = client.gets
if answer2.include?("OK")
client.puts("Befehl_der_vom_Server_ausgeführt_werden_soll")
# Antwort auffangen und verarbeiten
while line = client.gets
if line.include?("Moeglichkeit_1")
[... Antwort verwursten ... ]
elsif line.include?("Moeglichkeit_2")
[... Antwort verwursten ... ]
elsif line.include?("Etwas_ganz_anderes")
[... Antwort verwursten ... ]
break # alle benötigten Daten zusammen
end
next
end
end
break
end
end
break
end

[... mit den empfangenen Daten arbeiten ...]


So, mein Problem ist nun ... obiges gehackwurzel soll ein selbstverzaptes
"Protokoll" umsetzen. Abgesehen davon das das ganze Konstrukt für mein
Empfinden, gelinde gesagt unelegant gelöst ist, bleibt die Kommunikation trotz
der break- & next-Anweisungen manchmal (unreproduzierbar) in einer der
While-Schleifen hàngen. Ich habe es auch schon mit client.recv(x) versucht,
scheitere aber an unterschiedlichen Zeilenlàngen ...

Kann mich jemand darauf stossen, wie ich am besten-/ stabilsten-/
fehlertolerantesten- diese Pseudo-Protokoll-Kommunikation umsetze?
Zudem würde mich interessieren ob es soetwas wie eine Timeout-funktion gibt, die
die Verbindung nach einer Weile ohne Kommunikation unterbricht. Bzw. wie setz
ich das ggf. selbst um ... Im Moment habe ich wohl nen Klotz statt Kopf

Ich bin für jeden Einwurf dankbar.

Gruß
Andreas
 

Lesen sie die antworten

#1 Robert Klemme
28/05/2008 - 22:58 | Warnen spam
On 27.05.2008 11:23, akl wrote:
Hallo zusammen,

Ich versuche gerade mit einem Server per Socket zu kommunizieren. Da ich
damit
jedoch nicht wirklich Erfahrung habe, hoffe ich das Ihr mir weiterhelfen
könnt.

Folgendes Szenario:
Ich habe einen speziellen Server, an den ich per Socket Befehle schicke
und als
Antwort(en) eine, bzw. mehrere Zeilen zurückbekomme. Verschiedene
Schlüsselworte
in den Antworten an sich, sind Situationsabhàngig und bekannt. Die
Reihenfolge
der Antworten ebenso.

Ein Beispiel:
# Verbindung zum Java-Server aufbauen
client = TCPSocket.open(@prefs['java_host'], @prefs['java_port'])

while answer = client_to_close.gets
if answer.include?('STRING_A::')
client.puts("IDENT::#{identifikationsstring}")
while answer2 = client.gets
if answer2.include?("OK")
client.puts("Befehl_der_vom_Server_ausgeführt_werden_soll")
# Antwort auffangen und verarbeiten
while line = client.gets
if line.include?("Moeglichkeit_1")
[... Antwort verwursten ... ]
elsif line.include?("Moeglichkeit_2")
[... Antwort verwursten ... ]
elsif line.include?("Etwas_ganz_anderes")
[... Antwort verwursten ... ]
break # alle benötigten Daten zusammen
end
next
end
end
break
end
end
break
end

[... mit den empfangenen Daten arbeiten ...]


So, mein Problem ist nun ... obiges gehackwurzel soll ein selbstverzaptes
"Protokoll" umsetzen. Abgesehen davon das das ganze Konstrukt für mein
Empfinden, gelinde gesagt unelegant gelöst ist, bleibt die Kommunikation
trotz
der break- & next-Anweisungen manchmal (unreproduzierbar) in einer der
While-Schleifen hàngen. Ich habe es auch schon mit client.recv(x) versucht,
scheitere aber an unterschiedlichen Zeilenlàngen ...

Kann mich jemand darauf stossen, wie ich am besten-/ stabilsten-/
fehlertolerantesten- diese Pseudo-Protokoll-Kommunikation umsetze?
Zudem würde mich interessieren ob es soetwas wie eine Timeout-funktion
gibt, die
die Verbindung nach einer Weile ohne Kommunikation unterbricht. Bzw. wie
setz
ich das ggf. selbst um ... Im Moment habe ich wohl nen Klotz statt Kopf

Ich bin für jeden Einwurf dankbar.



Hier ein paar "Einwürfe":

Es gibt eine lib, die expect-artiges Verhalten implementiert (-> RAA).

Das Parsen (if elsif Kaskade) kann man eleganter mit case und regulàren
Ausdrücken lösen.

Wenn du die Lànge der Antworten genau kennst, kannst du vielleicht auch
mit IO#read arbeiten.

Möglicherweise brauchst du select() oder einen zweiten Thread.

So, das war meine lose Blattsammlung. :-)

robert

Ähnliche fragen