Was ist die effizienteste Art und Weise von TCPServer zu lesen?
Frage
Ich erstelle einen Rubin-Server, der auf einen TCP-Client eine Verbindung herstellt. Mein Server wird mit einem TCPServer und ich bin versucht, TCPServer :: recv () zu verwenden, aber es wartet nicht auf Daten, so geht nur in einer engen Schleife, bis Daten empfangen werden.
Was ist der effizienteste Weg, intermittant Daten zu verarbeiten? Ich bin nicht in der Lage die Daten zu ändern, in gesendet werden, da ich bin versucht, einen anderen Server zu emulieren. Welche lesen sich wie Anweisung von TCPServer / TCPSocket für Daten gesendet warten würde?
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
Vielen Dank für Ihre Zeit.
Lösung
Sie sind sicher, dass recv kehrt nicht „“ - Was bedeutet der Socket geschlossen ist? Wenn nicht, dann vielleicht werden Ihre Steckdosen auf nicht blockierende irgendwie?
eventmachine ist in der Tat weit schneller als Fäden für die Socket-Programmierung mit :) GL. -r
Andere Tipps
Auf der Grundlage der Fragen, die Sie haben gefragt, ich glaube, Sie einen Rahmen wie eventmachine versuchen sollten, und einen Server schreiben, die implementiert, was Sie wollen, anstatt zu versuchen mit dem Schreiben einen Server-Wrapper Aufheben um.
aber sagt, dass die effizienteste Art und Weise aus der Steckdose zu lesen ist, einen richtigen wählen Anruf zu verwenden und all offene Verbindungen abfragen. Zwar ist dies eine ziemlich akademische Sache für alle, die vor dem Client-Server-Anwendungen entwickelt haben, ist es ein Ärgernis, weil es eine Menge Dinge, die können Sie ganz einfach falsch. Zum Beispiel. mehr Verbindungen Umgang mit allen Arten von lästigen Situationen führen kann, wenn Sie nicht besonders vorsichtig sind Anrufe zu vermeiden, blockiert wird.
Der Rahmen eventmachine macht es einfach, Frage / Antwort-Typ-Server zu entwickeln, weil Sie immer mit einer Vorlage und arbeitet von dort aus starten können, zum Beispiel, die ich im internen :: eventmachine Protokollen :: LineAndTextProtocol man arbeitet als eine große Basis für die meisten.