Java 使用BufferedReader卡在While循环中

Java 使用BufferedReader卡在While循环中,java,sockets,Java,Sockets,我在Java中使用围绕BufferedReader的while循环时遇到了一个问题。我正在用插座做一些实验 我当前的代码: InetAddress address = InetAddress.getByName(this.IP); SocketAddress socketaddress = new InetSocketAddress(address, this.port); Socket socket = new Socket(); socket.

我在Java中使用围绕BufferedReader的while循环时遇到了一个问题。我正在用插座做一些实验

我当前的代码:

InetAddress address = InetAddress.getByName(this.IP);
        SocketAddress socketaddress = new InetSocketAddress(address, this.port);
        Socket socket = new Socket();
        socket.connect(socketaddress);

        if(socket.isConnected()){

            Executor.logger.info("Connection to proxy established!");

        }
        else {

            Executor.logger.warning("Connection to proxy failed!");
            socket.close();
            return;

        }

        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String temp2;
        while((temp2 = in.readLine()) != null){

            Executor.logger.info("Running query says " + temp2);

        }
但无论我尝试了什么,代码都不会前进到下一行。它不会向我的记录器发送垃圾邮件,它只是突然停止并卡住

这只是客户端,我不能控制接收方服务器端

我做错什么了吗

提前谢谢你的帮助

编辑


服务器是一个命令行,它接受带有变量的命令,并返回一段代码,告诉您刚才所做的事情的结果。但是,当您第一次连接时,它会返回消息、空行、消息、空行之类的内容,这是当前卡住的循环。

测试后,我找到了一个替代变量,可用于检测BufferedReader是否已满

如果更改此代码中的((temp2=in.readLine())!=null):

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    String temp2;
    while((temp2 = in.readLine()) != null){

        Executor.logger.info("Running query says " + temp2);

    }
并改用布尔值(in.ready()):


当BufferedRead没有更多的数据可读取时,它将停止循环,并可在必要时通过再次复制循环来重新初始化。

它会阻塞
readLine()
,因为它正在等待数据。连接未关闭,因此
readLine()
不会返回
null
,但没有任何数据进入,因此它会一直等待数据到达。服务器可能正在等待您的输入,直到返回更多数据。写入程序还需要另一个线程,以便可以同时接收数据和发送数据。是否有方法检测BufferedReader何时为空?我确实需要代码在构造函数中进行,因为它是基于构造函数的。您应该使用像DataFetcher这样的线程侦听器:构造函数中不是该代码的正确位置。您仍然需要另一个线程将数据写回服务器,因为当
readLine()
阻塞时,读取线程不会执行任何操作。据我所知,服务器仅从输入数据返回响应代码。你是说我需要读卡器在不写入outputstream的情况下连续运行?如果没有完整的行可用,这仍然会阻塞。我在没有输入的情况下编写它的测试似乎有效,代码只是跳过。该方法如下:“告知此流是否已准备好读取。如果缓冲区不为空,则缓冲字符流已准备好…”我建议您阅读一些网络教程,了解如何正确执行网络IO。这不是正确的方法,即使它可能适用于特定情况。或者你可以学习错误的方法,然后在将来的某个时候因为它而遇到错误。如果你有更好的方法,请随意回答这个问题。这是我发现的唯一可行的方法(研究或实验),而且目前没有其他选择。
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        out.write("login " + this.user + " " + this.password);
        out.flush();

        String temp2;
        while(in.ready()){

            temp2 = in.readLine();

            Executor.logger.info("Running query says " + temp2);

        }