java - 客户端在监听服务器时主动等待

标签 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;
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 内部,否则它不会仅在异常之后调用。

希望这能让您澄清一点。

关于java - 客户端在监听服务器时主动等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41254562/

相关文章:

java - 将数组字节转换为二进制

Java Web Server 突然停止响应,没有任何异常

java - Elasticsearch带数字的字符串的SuggestResponse错误

java - 线程运行如何开始?

javascript - 使用javascript将值从php页面传递到html页面

java - 错误: A JSONObject text must begin with '{' at 1688 [character 1689 line 1]

java - 设置Java系统属性,为什么这段代码不起作用?

Java同步外部文件读写

C# 多个类可以使用多个引用锁定同一个对象吗?

java - 非法参数异常 : ProtectionToken is not a <wsp:Policy> element