从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用

Posted

技术标签:

【中文标题】从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用【英文标题】:Android Socket BufferedReader readLine() not working when reading from the InputStream 【发布时间】:2021-09-30 08:28:50 【问题描述】:

我正在尝试在线程内循环代码,以便定期检查来自服务器的新数据。我正在使用InputStream.available() 来检查是否有要读取的字节。如果是这样,我打开一个新线程并尝试使用BufferedReader 读取数据,然后将其记录到控制台。

在 onCreate 中:

HandlerThread ht = new HandlerThread("CheckForData");
                ht.start();
                Looper checkForDataLooper = ht.getLooper();
                checkForDataHandler = new Handler(checkForDataLooper);
                checkForDataHandler.post(checkForData);

两个可运行文件:

Runnable checkForData = new Runnable() 
        @Override
        public void run() 
            try 
                Log.d("Count", "run: " + inputStream.available());
                if (inputStream.available() > 0) 
                    checkForDataHandler.removeCallbacks(checkForData);
                    new Thread(parseData).start();
                
            
            catch (Exception e) 
                Log.e("Exception", "run: " + e);
            
            checkForDataHandler.postDelayed(checkForData, 3000);
        
    ;
Runnable parseData = new Runnable() 
        @Override
        public void run() 
            String line = null;
            StringBuilder data = new StringBuilder();
            try 
                while ((line = in.readLine()) != null) 
                    data.append(line);
                
                Log.d("PARSED DATA", "run: " + data);
            
            catch (Exception e) 
                e.printStackTrace();
            
        
    ;

控制台:

D/Count: run: 0
D/AwareBitmapCacher: handleInit switch not opened pid=26256
D/Count: run: 0
D/Count: run: 0
D/Count: run: 4
D/Count: run: 0
D/Count: run: 0
D/Count: run: 0
D/Count: run: 0
W/System.err: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:215)
        at java.net.SocketInputStream.read(SocketInputStream.java:144)
W/System.err:     at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:291)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:355)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:181)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:172)
        at java.io.BufferedReader.readLine(BufferedReader.java:335)
        at java.io.BufferedReader.readLine(BufferedReader.java:400)
W/System.err:     at com.bitline.httpcomtest.MainActivity$3.run(MainActivity.java:121)
        at java.lang.Thread.run(Thread.java:929)

控制台中的第 5 行代表我从服务器发送一些数据的时刻。我可以看到 InputStream 中的字节数修改了,然后 BufferedReader 使用它们,但数据没有记录到控制台。 当我强制关闭服务器时抛出异常。

PS。我是线程和网络的新手,所以如果这是我犯的一些新手错误,我深表歉意。

谢谢。

【问题讨论】:

data.append(line); 那应该是data.append(line).append("\n");。如果您有不止一个,为了保留原始行。 【参考方案1】:

我找到了答案: 服务器没有在数据末尾发送\n\rBufferedReader.readLine() 查找这些字符之一。结果,InputStream 被无休止地阅读。

【讨论】:

简而言之:如果客户端尝试读取一行,则服务器应该发送一个。一行是以换行符 \n 结尾的字符串。

以上是关于从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 InputStream 读取时出现 IOException

如何在 Android 上从蓝牙的 InputStream 中读取

安卓 | Kotlin:应用程序从 InputStream 读取到缓冲区问题

InputStream 没有收到 EOF

java InputStream读取数据问题

java InputStream读取数据问题