Java:从Socket读取的BufferedReader没有获得整个缓冲区

时间:2014-01-17 00:17:58

标签: java sockets bufferedreader

我有这个问题,因为两天,我有搜索和研究,并改变了一件事,但问题仍然存在。我正在为IRC构建一个机器人,只是为了好玩,它之前在一个非常混乱的方法中工作得很好我处理了所有服务器的响应,reconection,autjoin等等。然后我决定组织我的代码和代码搞砸了。

我真的没有看到错误,具体的问题是我的读者对象现在没有像以前那样从IRC服务器读取整个缓冲区。我检查从telnet连接我发送一些IRC命令后应该收到的任何响应,但是现在缓冲区没有发送给我所有我想我应该从服务器获取,知道irc协议。

当我实现我的bot核心类并处理缓冲区读取时,这是该类的主要方法:

public  static void main(String[] args){
    String name = "Robocot777";
    String server = "irc.freenode.net";
    String channel = "#botwar";
    String owner = "M1k3_";
    int port = 6667;

    final Bot bot1 = Bot.getInstance(server, 
            channel, name, owner, port);

    bot1.setVerbose(true);
    bot1.connect();
    bot1.nick(name);

    while(true){
        try {
            String buffer;

            while((buffer = bot1.getReader().readLine()) != null){
                String[] splitBuffer = buffer.split(":");
                System.out.println("\nBUFFER: " + buffer);
                if(buffer.contains("PING"))
                    System.out.println("The buffer totally contains PING on it!!!!");
                if(splitBuffer[0].trim().equals("PING")){
                    System.out.println("We got receive a PING!");
                    bot1.pong(splitBuffer[1]);
                }if(splitBuffer[0].trim().equals("ERROR")
                        && splitBuffer[1].equals("Closing Link")){
                    System.out.println("We got receive an ERROR - Closing Link!");
                    bot1.waitTime();
                    bot1.setConnected(false);
                    bot1.connect();
                }

                if(buffer.contains("433") && splitBuffer.length >= 1){
                    if(splitBuffer[1].split(" ")[1].equals("433")){ // The nick is already in use
                        if(bot1.isRegistered() == false){
                            System.err.println("The nick \"" + name + "\" is already in use!\n"+
                                    "So, I'm leaving...set other nick!");
                            System.exit(1);
                        }
                    }
                }

                if(buffer.contains("451") && buffer.split(" ").length >= 1){
                    if(buffer.split(" ")[1].equals("451")){ // User must register first on the server
                        System.out.println("Must register! Asked!");
                        bot1.setJoinned(false);
                        bot1.setUsered(false);
                        bot1.user(bot1.getName(), "I'm just a bot");
                        bot1.join(bot1.getChannel());
                    }
                }

                if(buffer.contains("474") && buffer.split(" ").length >= 1){
                    if(buffer.split(" ")[1].equals("474")){ // User can join channel, probably banned (+b)
                        System.out.println("Wow! We have been banned!");
                        bot1.setJoinned(false);
                        bot1.join(bot1.getChannel());
                    }
                }

                if(buffer.contains("KICK") && buffer.split(" ").length >= 1){
                    if(buffer.split(" ")[1].equals("KICK") // Bot have been kicked
                            && buffer.split(" ")[2].equalsIgnoreCase(bot1.getChannel())
                            && buffer.split(" ")[3].equalsIgnoreCase(name)){
                        System.out.println("Wow! We have been kicked!");
                        bot1.setJoinned(false);
                        bot1.waitTime();
                        bot1.join(bot1.getChannel());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

是的,这是一个非常混乱的方法,这就像我再次因为我的不同而不知道错误是什么。

现在这是我的connect()方法,我认为这是相关的:

public void connect(){
    try {
        System.out.println("Server: " + this.server + "\tChannel: "
        + this.channel + "\tBot name: " + this.name + "\tPort: " + port);
        socket = new Socket(this.server, this.port);
        socket.setKeepAlive(true);
        setWriter(new PrintWriter(socket.getOutputStream(), true));
        setReader(new BufferedReader(new InputStreamReader(socket.getInputStream())));
        setConnected(true);
        setJoinned(false);
        setUsered(false);
    } catch (UnknownHostException e) {
        System.err.println("We got an error: " + e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        System.err.println("We got an error: " + e.getMessage());
        e.printStackTrace();
    }

}

是的,我将命令发送到服务器并返回carriege以及所有:

 writer.write("NICK " + name + "\r\n");

所以,正如我之前所说,我的问题是我没有使用我的BufferedReader对象从服务器获取整个bugger,所以我非常感谢任何帮助。

问候。

1 个答案:

答案 0 :(得分:1)

 while((buffer = bot1.getReader().readLine()) != null){

这看起来好像每次读一行都构建一个新的BufferedReader。您必须在套接字的生命周期中使用相同的一个。同样用于输出的任何内容。