【问题标题】:Client active wait while listening from server从服务器监听时客户端主动等待
【发布时间】:2016-12-21 03:20:22
【问题描述】:

您好,我正在用 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);
        }
    }
}

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

【问题讨论】:

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


    【解决方案1】:

    所以这就是你的代码不优雅的地方:

    • 您在每次读取时重新创建输入流。
    • 您的嵌套 while 没有用,fromServer 在第二次迭代中永远不会为空。它只会挂起,直到数据流式传输。 (这与从文件中读取不同,明白吗?)

    现在呢?去掉外层 while循环,在内层循环中将条件改为真(无限);它只会在异常时终止。

    还有一点,把print语句移到里面 while,否则它不会在异常之后才调用。

    希望这能澄清你的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多