簡體   English   中英

從 InputStream 讀取時,Android Socket BufferedReader readLine() 不起作用

[英]Android Socket BufferedReader readLine() not working when reading from the InputStream

我試圖在線程內循環代碼,以便定期檢查來自服務器的新數據。 我正在使用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 使用它們,但數據沒有記錄到控制台。 當我強制關閉服務器時拋出異常。

附注。 我是線程和網絡的新手,所以如果這是我犯的一些新手錯誤,我深表歉意。

謝謝你。

我找到了答案:服務器沒有在數據末尾發送\\n\\r並且BufferedReader.readLine()查找這些字符之一。 結果, InputStream被無休止地讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM