mirror of
				https://github.com/msgpack/msgpack-c.git
				synced 2025-11-04 12:17:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
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
 | 
						|
 | 
						|
		if @buffer.length > 10*1024*1024
 | 
						|
			raise "message is too large"
 | 
						|
		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
 | 
						|
 |