Рубиновые сокеты не получают все сообщения - PullRequest
1 голос
/ 01 апреля 2012

Я написал небольшой скрипт на Ruby для подключения и входа на IRC-сервер, но когда IRC-сервер отправляет новое сообщение, сокет не получает его, например, журнал:

:irc.someserver.net NOTICE Auth :*** Looking up your hostname...
:irc.someserver.net NOTICE Auth :Welcome to someserver Net!
:irc.someserver.net 003 brobot :This server was created 15:40:35 Mar 28 2012
:irc.someserver.net 005 brobot MAXTARGETS=20 MODES=20 NETWORK=Studio NICKLEN=32 Net PREFIX=(ov)@+ STATUSMSG=@+ TOPICLEN=308 VBANLIST WALLCHOPS WALLVOICES :are supported by this server
:irc.someserver.net 372 brobot :- Welcome To the someserver Chat Server. Please Select the #Team Channel.
:irc.someserver.net 252 brobot 1 :operator(s) online
:irc.someserver.net 265 brobot :Current Local Users: 5  Max: 5
:irc.someserver.net 353 brobot = #brobot_dev :@Pablo brobot 
:Pablo!Pablo@ip-10-1-1-6.ec2.internal PRIVMSG #brobot_dev :f
PING :irc.someserver.net

Это пример журнала, он выглядит нормально, но на :Pablo!Pablo@ip-10-1-1-6.ec2.internal PRIVMSG #brobot_dev :f это когда он пропускает сообщения.Например, я отправляю 5 сообщений, а клиент получает только 1. Это код клиента:

require 'socket'      # Sockets are in standard library

hostname = '10.1.1.1'
port = 6667

server = TCPSocket.open(hostname, port)

loop {
    server.flush
    puts server.gets.chomp

    if server.gets.chomp =~ /:.*NOTICE Auth :\*\*\* Found your hostname/
        server.puts "USER brobot brobot brobot brobot\r\nNICK brobot\r\n"
    elsif server.gets.chomp =~ /:\S* 26*/
        server.puts "JOIN #brobot_dev\r\n"
    end
}

Что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 06 июля 2013

Проблема в том, что

puts server.gets.chomp

собирает данные, отправленные сервером, распечатывает их и удаляет их. Затем вы вызываете одно и то же еще дважды, и каждый раз новые данные собираются. Попробуйте это:

@response = server.gets.chomp
# use contents of @response instead of calling #gets again
if @response =~ /:.*NOTICE Auth :\*\*\* Found your hostname/
    server.print "USER brobot brobot brobot brobot\r\nNICK brobot\r\n"
elsif @response =~ /:\S* 26*/
    server.print "JOIN #brobot_dev\r\n"
end

Я заменил ваши «путы» на принты, потому что вы включаете \ r \ n в строку.

...