Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IRCLib Java创建的IRC Bot问题_Java_Buffer_Chat_Bots_Irc - Fatal编程技术网

IRCLib Java创建的IRC Bot问题

IRCLib Java创建的IRC Bot问题,java,buffer,chat,bots,irc,Java,Buffer,Chat,Bots,Irc,我正在使用IRCLib for Java创建一个IRC机器人。它使用Moepii作为图书馆提供的客户端。Moepii的问题是它没有内置防洪设施,所以我需要自己来实现。目前,我的机器人在响应大量命令时触发了Quakesnet过量洪水并获得启动 有人对我如何实施防洪有什么建议吗?我得到的一个想法是假设一个1024字节的缓冲区,一旦到达,就向服务器发送一个Ping并等待响应,然后继续。我以前从未与IRC合作过,所以我希望能得到一些建议 当前实施 private class FloodMonitor i

我正在使用IRCLib for Java创建一个IRC机器人。它使用Moepii作为图书馆提供的客户端。Moepii的问题是它没有内置防洪设施,所以我需要自己来实现。目前,我的机器人在响应大量命令时触发了Quakesnet过量洪水并获得启动

有人对我如何实施防洪有什么建议吗?我得到的一个想法是假设一个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);
            }
        });

    }
}
私有类FloodMonitor实现可运行{
私有最终整数最大字节数=512;
私有int messageBuffer=0;
私有布尔挂起=false;
私有布尔停止=false;
@凌驾
公开募捐{
当(!停止){
而(!挂起){
MessageStructure message=out.peek();
如果(消息!=null){
messageBuffer+=message.msg.getBytes().length;
if(messageBuffer
私有类FloodMonitor实现可运行{
专用最终整数最大字节=768;
私有int messageBuffer=0;
私有布尔挂起=false;
私有布尔停止=false;
@凌驾
公开募捐{
当(!停止){
而(!挂起){
final MessageStructure message=out.peek();
如果(消息!=null){
messageBuffer+=message.msg.getBytes().length;
if(messageBuffer
对我来说,这是一个可靠的计划。尝试一下,看看这是否对您有效。我的问题是,在(additiveSize+new message size>1024)发送ping之前,我是否会获取队列中每条消息的字节大小,等待响应,然后发送保留的消息?当然,如果服务器没有被您“淹没”,您会立即收到一个PONG,然后您可以重置缓冲区,然后继续回答。确保不要接受任何进一步的命令(在等待ping时),以防止洪水攻击。我只会将所有命令添加到队列的末尾,只是不会处理它们。听起来是个可靠的计划。谢谢我会在测试后用结果更新它。不过看起来已经足够坚固了。感谢您创建了缓冲区,但仍然存在被踢的问题。发布我的实现
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;
    }
}