2012-12-15 32 views
0

我正在使用IRCLib for Java創建一個IRC bot。它使用Moepii作爲圖書館提供的客戶端。 Moepii的問題是它沒有建立防洪體系,所以我需要實施這個我的自我。目前,我的機器人在響應大量命令時觸發Quakesnet超額洪水並獲得引導。IRCLib Java創建的IRC Bot問題

有沒有人對我如何實施防洪有任何建議?我得到的一個想法是假設一個1024字節的緩衝區,一旦達到,就向服務器發送一個Ping並等待響應,然後繼續。我從來沒有與IRC合作過,所以我希望有一些指針。

當前實現

private class FloodMonitor implements Runnable { 

    private final int MAXBYTES = 512; 
    private int messageBuffer = 0; 
    private boolean suspend = false; 
    private boolean stop = false; 

    @Override 
    public void run() { 

     while (!stop) { 
      while (!suspend) { 
       MessageStructure message = out.peek(); 
       if (message != null) { 
        messageBuffer += message.msg.getBytes().length; 
        if (messageBuffer < MAXBYTES) { 
         out.poll().sendMessage(); 
        } else { 
         suspend(); 
         message.bot.send("ping irc.quakenet.org"); 
        } 
       } 
      } 
     } 
    } 

    public void resetBuffer() { 
     messageBuffer = 0; 
     suspend = false; 
    } 

    public void stop() { 
     stop = true; 
    } 

    public void suspend() { 
     suspend = true; 
    } 
} 

private class MessageStructure { 

    public String target; 
    public String msg; 
    public BotConnection bot; 

    MessageStructure(String target, String msg, BotConnection bot) { 
     this.target = target; 
     this.msg = msg; 
     this.bot = bot; 
    } 

    private void sendMessage() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       bot.doPrivmsgApproved(target, msg); 
      } 
     }); 

    } 
} 
+1

聽起來像一個堅實的計劃給我。試試看看是否適合你。 –

+0

問題我有,但我會得到每個消息在隊列中的字節大小,直到(additiveSize +新消息大小> 1024)發送一個ping,等待響應,然後發送被擱置的消息? – meriley

+0

當然,如果服務器沒有被你「淹沒」,你會立即得到一個PONG,然後你可以重置緩衝區,然後繼續回覆。確保不接受任何進一步的命令(等待ping時),以防止洪水攻擊。 –

回答

1
private class FloodMonitor implements Runnable { 

    private final int MAXBYTES = 768; 
    private int messageBuffer = 0; 
    private boolean suspend = false; 
    private boolean stop = false; 

    @Override 
    public void run() { 

     while (!stop) { 
      while (!suspend) { 
       final MessageStructure message = out.peek(); 
       if (message != null) { 
        messageBuffer += message.msg.getBytes().length; 
        if (messageBuffer < MAXBYTES) { 
         out.poll().sendMessage(); 
        } else { 
         suspend(); 

         SwingUtilities.invokeLater(new Runnable() { 

          @Override 
          public void run() { 
           message.bot.send("ping irc.quakenet.org"); 
          } 
         }); 

        } 
       } 
      } 
     } 
    } 

    public void resetBuffer() { 
     messageBuffer = 0; 
     suspend = false; 
    } 

    public void stop() { 
     stop = true; 
    } 

    public void suspend() { 
     suspend = true; 
    } 
}