Java:BufferedReader从套接字读取不会获得整个缓冲区

Java:BufferedReader从套接字读取不会获得整个缓冲区,java,sockets,bufferedreader,Java,Sockets,Bufferedreader,我有这个问题,因为两天以来,我已经搜索和研究,并改变了一件事,但问题仍然存在。我正在为IRC构建一个bot,只是为了好玩,它以前确实工作得很好,我用一种非常混乱的方法处理了所有服务器的响应、重新连接、自动加入等。然后我决定组织我的代码,代码就搞糟了 我真的没有看到错误,具体的问题是我的reader对象现在没有像以前那样从IRC服务器读取整个缓冲区。当我发送一些IRC命令时,我检查了从telnet连接我应该收到的任何响应,但是现在缓冲区并没有发送我认为应该从服务器获得的所有响应,这在IRC协议中是

我有这个问题,因为两天以来,我已经搜索和研究,并改变了一件事,但问题仍然存在。我正在为IRC构建一个bot,只是为了好玩,它以前确实工作得很好,我用一种非常混乱的方法处理了所有服务器的响应、重新连接、自动加入等。然后我决定组织我的代码,代码就搞糟了

我真的没有看到错误,具体的问题是我的reader对象现在没有像以前那样从IRC服务器读取整个缓冲区。当我发送一些IRC命令时,我检查了从telnet连接我应该收到的任何响应,但是现在缓冲区并没有发送我认为应该从服务器获得的所有响应,这在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 return将命令发送到服务器,以及所有这些:

 writer.write("NICK " + name + "\r\n");
所以,正如我之前所说的,我的问题是,我的BufferedReader对象并没有从服务器上得到整个bug,所以我非常感谢您的帮助

你好

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

这看起来好像每次读一行时都在构造一个新的
BufferedReader
。在插座的使用寿命内,必须使用相同的插座。输出也一样。

我理解你说的话,但我不这么认为,因为它与我的Bot类中对objet BufferedReader的引用是相同的,它同时也是我调用connect()时得到的对象,我只调用了一次,在while进入main之前,所以我不构建新的BufferedReader,即getReader()方法只返回bot类中的BufferedReader。无论如何,我也尝试过将单个对象从while循环中取出一次,然后使用while((buffer=reader.readLine())!=null)仍然失败。在这种情况下,服务器不会发送您认为它正在发送的内容。在重新连接新插座之前,还需要关闭插座。我在你的代码中看不到这一点。是的,当然,我这样做了,注意我没有把整个代码放在两个方法中,我有一个关闭资源的方法,是的,服务器正在发送我认为它正在发送的东西,如果你通过telnet或netcat连接,你可以看到它,无论如何,我已经在做了。谢谢你的时间,如果你没有发布所有相关的代码,你就不能指望得到相关的帮助。TCP不会丢失数据,Java也不会。这个错误显然在你的代码中的某个地方。好吧,再次感谢你,我知道TCP不会丢失数据,是的,我可能应该发布整个类。不管怎样,我已经解决了。不幸的是,这对我来说有点沮丧,我不能说是什么导致了这个问题。我现在所做的唯一不同的事情(或多或少)是,我现在正在读取同一个Bot类中的缓冲区,而在另一个Bot类中没有,因此它可以给您一些信息和想法。