【问题标题】:TCP Client Socket is not getting listen to receiver threadTCP 客户端套接字未侦听接收器线程
【发布时间】:2021-01-31 23:03:48
【问题描述】:

以下代码无法从 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);
          }
       }
    }
}

【问题讨论】:

  • (!((line = bufferedReader.readLine()) != null)) 两次 NOT 使得它非常难以阅读。请适应我们普通的编码员。

标签: android multithreading sockets tcp bufferedreader


【解决方案1】:

外部循环是不必要的,应该删除。但更重要的是,只有当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();
        }
    }
}

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

【讨论】:

  • 谢谢雷米勒博。是的,实际上我正在尝试连接到 rfid 阅读器。这将一直连接。那么我可以在这段代码中做些什么修改呢?
  • @BiplabDe 这完全取决于 RFID 阅读器实际使用的通信协议类型。没有这个细节很难回答你的问题。您能否提供一些关于 RFID 阅读器实际期望的文档或示例?
  • RFID 有一些标签要扫描,它会通过网络发送数据。我有一个 android 应用程序来听它。套接字 = 新套接字(); InetSocketAddress inetSocketAddress = new InetSocketAddress(strIP,nPort); socket.connect(inetSocketAddress, 5000);使用这些代码,我可以在一个线程内连接。现在我有另一个线程用于从 rfid 阅读器接收数据。并且 android app 和 rfid reader 将在同一个网络中。
  • 我的目标是在 4196 端口上构建监听 rfid 阅读器的 Android 应用程序。每当发生标签扫描时,Android TCP 客户端应用程序必须读取并记录它。
  • @BiplabDe 没有回答我的问题。 RFID 阅读器在传输数据时必须以特定方式格式化扫描的数据。那是什么格式?阅读器必须以某种方式界定多次扫描。读者用来与感兴趣的客户交流的语义是什么?如果你不能回答这个问题,那么你就无法与读者进行有效的沟通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多