从服务器收听时客户端主动等待

时间:2016-12-21 03:20:22

标签: java multithreading client client-server java-threads

您好我在java中编写了一个小型app客户端/服务器。我需要客户端永久监听服务器所以我想出了一个涉及线程的解决方案,这里是代码

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);
        }
    }
}

我不知道这样做是否是一种好习惯,而且我觉得不是优雅",那么你能帮助我找到更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

所以这里的代码并不优雅:

  • 您可以在每次阅读时重新创建输入流。
  • 你的嵌套while无用,fromServer在第二次迭代时永远不会为null。它将一直挂起,直到数据流式传输。 (它与阅读文件有所不同,得到了吗?)

现在怎样?删除外部 while循环,并在内部循环中将条件更改为true(无限);它只会在例外情况下终止。

还有一件事,将print语句移到中,否则只有在异常后才会调用。

希望这能澄清你的想法。

相关问题