首页 > 解决方案 > TCP 客户端套接字未监听接收器线程

问题描述

以下代码无法从 TCP 服务器读取数据。我无法找到问题。任何帮助将不胜感激。

class Receive extends Thread {
    public void run() {
        while (true){
           StringBuilder log = new StringBuilder();
           String line = null;
           BufferedReader bufferedReader = null;
           try {
              bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           } catch (IOException e) {
              e.printStackTrace();
           }

           if(bufferedReader!=null){
             while (true) {
                try {
                    if (!((line = bufferedReader.readLine()) != null)) break;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                log.append(line);
             }
             Log.d("==> ", "data is " + line);
          }
       }
    }
}

标签: androidmultithreadingsocketstcpbufferedreader

解决方案


外循环是不必要的,应该删除。readLine()但更重要的是,只有在返回一个字符串时才打破内部循环null,然后再尝试记录它null

试试这个:

class Receive extends Thread {
    public void run() {
        try {
            StringBuilder log = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                log.append(line);
            }
            Log.d("==> ", "data is " + log.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

话虽如此,请注意这种代码会从服务器读取整行,直到它断开您的客户端。并非所有协议都是基于线路的,或者服务器发送数据后断开连接。如果这就是您的服务器的行为方式,那就这样吧。但这对于服务器来说是不寻常的。在不知道您实际连接到哪种服务器的情况下,很难说是否应该首先使用这种代码。


推荐阅读