Ruby 套接字未接收到所有消息

Posted

技术标签:

【中文标题】Ruby 套接字未接收到所有消息【英文标题】:Ruby sockets not receiving all the messages 【发布时间】:2012-04-01 17:46:57 【问题描述】:

我在Ruby上写了一个小脚本来连接并登录IRC服务器,但是当IRC服务器发出新消息时,socket没有收到,例如日志是:

: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】:

问题是

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

我已将您的 'puts' 替换为 'print',因为您在字符串中包含了 \r\n。

【讨论】:

以上是关于Ruby 套接字未接收到所有消息的主要内容,如果未能解决你的问题,请参考以下文章

Web Socket 消息未全部接收

套接字 io 仅在最后接收消息

Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

通用 Windows 上的 UDP 套接字未接收数据

将消息发送到套接字端口并使用Spring Integration接收响应

套接字编程c ++ windows,看不到从服务器接收到的消息[关闭]