Programmieren eines Datenservers unter Ruby

Hallo,
ich habe ein Problem.
Ich möchte unter Ruby einen Server programmieren, der Daten in Empfang nimmt und auf Grund einer Kennung in den Daten entsprechend reagiert. Ich habe das realisiert, lese die Daten in einen String ein (session.gets() ), werte die ersten 3 Zeichen als Kennung aus und reagierte darauf. Läuft prima.
Jetzt benötige ich aber einen Server, an den sich ein Client mittels „Standverbindung“ anmeldet, der also nach dem Senden den Port nicht schliesst. Ohne das Schliessen des Clients erkennt mein Server das Datenende nicht. Das muss ich ändern, aber wie? Mit session.read() komm ich nicht weiter.
In den Daten, die gesendet werden, (jetzt binär durch ein c-Programm) steht als short die Telegrammlänge, als Short die Kennung und dann weitere Daten. mit pack und unpack kann ich den binärdaten zu Leibe rücken, das funktioniert auch, solange der Client die Verbindung schliesst. Aber wie sag ich dem Server: lese das Telegramm bis Ende und warte auf das nächste Telegramm ohne dass der Client die Verbindung beendet?

server = TCPServer.open( host, port)
loop do # Beginn der Endlosschleife
begin
session = server.accept
str = session.gets()

kennung = str[0…3].to_i

case kennung
when serverKill …
end

rescue
printf( „ERROR accept — gets ERROR: #{$!}“ )
end
end

Für jede Antwort bin ich dankbar

Hi,

sorry, aber Ruby ist nicht meins.

huschi.

Mal unabhängig von der Programmiersprache gibt es zwei Möglichkeiten:

  • Entweder Sie definieren ein Start / Ende-Token für das Telegram (bestimmte Binärfolge)

  • Oder Sie definieren eine Sendepause zwischen einzelnen Telegrammen.

In beiden Fällen müssen Sie eine saubere Fehlerbehandlung einbauen. (Im ersten Fall: Start ohne Ende, Ende ohne Start, ggfs. Prüfsumme, im zweiten Fall: unvollständiges Telegramm ggfs. Prüfsumme).

Ich kenne RUBY nicht. In anderen Sprachen gibt es aber durchaus Bibliotheken, die dieses Management für Sie übernehmen.

Hallo Roland,

Ich habe gerade die Doku nicht zur Hand, aber ich würde folgendermaßen an dein Problem rangehen:

Du sagst, dass der Server beim einlesen mittels gets kein Ende erkennt. Also musst du zuerst einmal nachschlagen, woran die gets-Methode erkennt, dass sie aufhören soll zu lesen. Soweit ich weiß, ließt gets zeilenweise, benötigt also ein Zeichen, das ein Zeilenende signalisiert. Wenn ich mich nicht irre, kannst du beim Aufruf von gets aber auch bestimmen, welches Separatorzeichen verwendet werden soll und wie viele Zeichen maximal gelesen werden sollen. Dies wäre ein möglicher Ansatzpunkt, um dein Problem anzugehen.

Eine andere Variante wäre, die Daten des Clients zeichenweise zu lesen und eine Abbruchbedingung zu definieren, wann der Server aufhören soll zu lesen. Hierfür könntest du auch die mitgelieferte Telegrammlänge verwenden.

Viele Grüße
Jürgen

Hallo Roland,

ich habe ein Problem.
Ich möchte unter Ruby einen Server programmieren, der Daten in
Empfang nimmt und auf Grund einer Kennung in den Daten
entsprechend reagiert.

Jetzt benötige ich aber einen Server, an den sich ein Client
mittels „Standverbindung“ anmeldet, der also nach dem Senden
den Port nicht schliesst. Ohne das Schliessen des Clients
erkennt mein Server das Datenende nicht. Das muss ich ändern,
aber wie?

Tut mir leid, da weiss ich jetzt auch nicht weiter :frowning:
Wenn hier nicht noch eine schlaue Antwort kommt, kann ich dir aber das Rubyforum empfehlen, für deine Frage speziell die Web & Netzwerk Gruppe:
http://forum.ruby-portal.de/viewforum.php?f=2
Wenn Du dort keine Antwort bekommst weiss es wahrscheinlich niemand… :wink:

Viele Grüße
Marvin

Hi,

in dem Gebiet bin ich kein experte, aber was ist mit einem paket, in dem die dateigrösse steht, oder wenn der client ein stop signal sendet?

sorry,

aber von ruby habe ich keine anhnung.

wäre es z.B. in Java könnte ich dir helfen…

aber ich bin mir sicher, dass das prinzipelle Herangehen wie bei Java ist.

vielleicht hilft dir das:
http://www.christian-klisch.de/java-socket-server.html

die Grundidee ist das der Server innerhalb eine Schleife ein Socket öffnet. Dieses Öffnen ist blockierend, so dass die Schleife „stehen“ bleibt. Wenn der Client seine Verbindung schliesst, wird durch die Schleife bedingt gleich ein neues Socket eröffnet.

Bei dieser Umsetzung kann immer nur ein Client behandlet werden. Der bessere Ansatz ist es, das man ein Socket in der Schleife öffnet, was am Netz lauscht. Wenn eine Verbindung eingeht, wird diese Socket-Instanz in einen eigenständigen Thread „verschoben“ und durch die Schleife bedingt wird ein neues Socket zum lauschen erstellt…

Wichtig bei der Thread-Geschichte, man muss paralle Zugriffe auf gemeinsame Ressourcen beachten. Weiterhin dass die Threads irgendwann von Server geschlossen werden, wenn der Client sie nicht schliesst…Stichwort DOS-Attacke

Hallo, leider kann ich da nicht helfen. Sorry.

Hi Roland,

mit Ruby hab ich es leider nicht so.
Sorry, ist nicht mein Feld.

Viel Erfolg trotzdem noch!

Gruesse
Preacher

hi,
in rubi kenn ich mich nicht sogut aus … bin es selber am lernen :wink: aber warum machst du den server in rubi und den client in c ?! das is ein bisschen umständlich xD

Lg, sakul6499

Hallo, das Problem liegt darin, dass ich den Server baue und mit unter von einem C-Client angesprochen werde. Ich halte nichts von Standleitungen. Mir ist eine terminierte Verbindung lieber. Dann kann ich auch meinem Server zur Kontrolle Telegramme senden und sehe ob er lebt, kann ihn sauber mit Telegramm beenden stgatt zu killen etc. Aber die Clientseite liegt nicht in meiner Hand :frowning:(

Hi,
sorry, die Mail ist mir irgendwie durchgegangen. Ist die Frage immer noch offen?

Grüße,
Ralph

Hallo, ja die Frage steht noch im Raum.
Da eine Lösung her musste, habe ich mir anderwertig geholfen. Die die Ruby - spezifische Antwort wäre gut.
Der fundamentale Serveraufbau sind ja nur 5-6 Zeilen. Die Lösungsvariante, so vorhanden, kurz gepostet wäre prima. Ich habe schon Bedenken, dass es an der Ruby-installation liegt. Keine Idee aus Buch oder Web zusammengesucht will funktionieren.

Danke

Hallo, ja die Frage steht noch im Raum.
Da eine Lösung her musste, habe ich mir anderwertig geholfen. Die die Ruby - spezifische Antwort wäre gut.
Der fundamentale Serveraufbau sind ja nur 5-6 Zeilen. Die Lösungsvariante, so vorhanden, kurz gepostet wäre prima. Ich habe schon Bedenken, dass es an der Ruby-installation liegt. Keine Idee aus Buch oder Web zusammengesucht will funktionieren.

Danke … mehr auf http://www.wer-weiss-was.de/app/query/display_query?..