summaryrefslogtreecommitdiff
path: root/example/stream.rb
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:10:00 +0000
committerfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:10:00 +0000
commit7e872371a241771489f3c48b7d364e4f6a9a248a (patch)
treefcd63c8485538bf039ffb5c7761d104ebb72c3ef /example/stream.rb
parent05b63f6c87d45ea2e1aa8a4d9f8bf665a50591a5 (diff)
downloadmsgpack-python-7e872371a241771489f3c48b7d364e4f6a9a248a.tar.gz
add examples
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@84 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
Diffstat (limited to 'example/stream.rb')
-rw-r--r--example/stream.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/example/stream.rb b/example/stream.rb
new file mode 100644
index 0000000..e53ce82
--- /dev/null
+++ b/example/stream.rb
@@ -0,0 +1,67 @@
+require 'msgpack'
+
+class Server
+ def initialize(sock)
+ @sock = sock
+ @pk = MessagePack::Unpacker.new
+ @buffer = ''
+ @nread = 0
+ end
+
+ def run
+ while true
+ begin
+ data = @sock.sysread(1024)
+ rescue
+ puts "connection closed (#{$!})"
+ return
+ end
+ receive_data(data)
+ end
+ end
+
+ private
+ def receive_data(data)
+ @buffer << data
+
+ while true
+ @nread = @pk.execute(@buffer, @nread)
+
+ if @pk.finished?
+ msg = @pk.data
+ process_message(msg)
+
+ @pk.reset
+ @buffer.slice!(0, @nread)
+ @nread = 0
+ next unless @buffer.empty?
+ end
+
+ break
+ end
+
+ rescue
+ puts "error while processing client packet: #{$!}"
+ end
+
+ def process_message(msg)
+ puts "message reached: #{msg.inspect}"
+ end
+end
+
+
+rpipe, wpipe = IO.pipe
+
+# run server thread
+thread = Thread.new(Server.new(rpipe)) {|srv|
+ srv.run
+}
+
+# client thread:
+wpipe.write ["put", "apple", "red"].to_msgpack
+wpipe.write ["put", "lemon", "yellow"].to_msgpack
+wpipe.write ["get", "apple"].to_msgpack
+wpipe.close
+
+thread.join
+