Мне нужен высокопроизводительный сетевой tcp сервер. Я написал этот код в EventMachine.
class ReactingServer < EventMachine::Connection
attr_accessor :packet, :packet_class
@@packet_count = 0
def initialize(packet_class)
super
@packet_class = eval(packet_class)
@packet = @packet_class.new
@@packet_count = 0
end
def receive_data(data)
@packet.clear
operation = proc do
@packet.read(data)
@@packet_count = @@packet_count +1
end
call_back = proc do
puts @packet.inspect
puts "-------------------#{@@packet_count}------------------------\n"
end
EventMachine.defer operation, call_back
end
end
Тогда я написал клиент ruby.
require 'rubygems'
require 'socket'
sock = TCPSocket.new("192.168.15.5", 8181)
500.times do |n|
packet = "\x00\x01\x1\x0\x1FNazar Hu\x00\x0F\xF\xF\xF\xF\xF\xF"
sock.send packet, 0
sleep 0.01
end
Первая проблема, с которой я сталкиваюсь, заключается в том, что, если я удаляю sleep
с клиента, многие пакеты не могут быть получены на стороне сервера. Если я отправляю 5 пакетов, в среднем получается 3 пакета. Почему это происходит.
Другой вопрос заключается в том, что моему серверу необходимо было установить соединение с 20K
, и в среднем 10 соединений отправляли бы пакеты на сервер в секунду. Способен ли EventMachine
справляться с такого рода нагрузками?