Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Java 从服务器侦听时客户端处于活动等待状态_Java_Multithreading_Client_Client Server_Java Threads - Fatal编程技术网

Java 从服务器侦听时客户端处于活动等待状态

Java 从服务器侦听时客户端处于活动等待状态,java,multithreading,client,client-server,java-threads,Java,Multithreading,Client,Client Server,Java Threads,您好,我正在用java编写一个小型应用程序客户机/服务器。我需要客户端永久监听服务器,所以我想出了一个涉及线程的解决方案,下面是代码 package ClientCommunication; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.util.logging.Level; impo

您好,我正在用java编写一个小型应用程序客户机/服务器。我需要客户端永久监听服务器,所以我想出了一个涉及线程的解决方案,下面是代码

package ClientCommunication;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Listen extends Thread {

    String fromServer;
    Socket kkSocket;
    boolean connected = true;

    Listen(Socket mysocket) {
        this.kkSocket = mysocket;
    }

    @Override

    public void run() {
        while (connected) {
            fromServer = null;
            BufferedReader in = null;
            try {
                in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
            } catch (IOException ex) {
                connected=false;
                Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                while (fromServer == null) {
                    fromServer = in.readLine();
                }
            } catch (IOException ex) {
                connected=false;
                Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("Received from Thread: " + fromServer);
        }
    }
}

我不知道这样做是否是一种好的做法,我觉得不“优雅”,所以你能帮我找到一个更好的解决方案吗?

下面是代码中不优雅的地方:

  • 每次读取时都会重新创建输入流
  • 嵌套的while是无用的,fromServer在第二次迭代中永远不会为null。它将一直挂起,直到数据流传输。(这与从文件中读取不同,明白吗?)
现在怎么办?移除外部while循环,并在内部循环中将条件更改为true(无限);它只会在异常情况下终止

还有一件事,将print语句移动到while中,否则它不会仅在异常后调用

希望这能澄清你的想法