【问题标题】:Android Socket Read ProblemsAndroid Socket 读取问题
【发布时间】:2023-03-25 18:10:01
【问题描述】:

我创建了一个连接到 Raspberry pi 热点的套接字。我能够成功连接到它并向 pi 发送一个字符串。但是,由于我尝试实现读取功能以从 pi 获取数据,因此遇到了一些问题。

每次我运行 while 循环或只有一个“response = myBufRead.readLine()”时,程序都会停止。

private class StatusCheck extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        //debug vibrations and text
        if(vibrate) {
            Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            vib.vibrate(100);
        }
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            Log.d(debugStr, "In initial connect");
            mySocket = new Socket(serverAddr, SERVERPORT);

        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            if (mySocket == null) {
                str1 = "Socket became null";
                return null;
            }
            str1 = "Connected";
            try {
                PrintWriter myPrintWriter = new PrintWriter(mySocket.getOutputStream(), true);
                InputStreamReader myInputStreamRead = new InputStreamReader(mySocket.getInputStream());
                BufferedReader myBufRead = new BufferedReader(myInputStreamRead);
                Log.d(debugStr, "In out created");

                myPrintWriter.write(recordName);

                Log.d(debugStr, String.valueOf(myBufRead.ready()));
                Log.d(debugStr, "About to enter while loop");
                while((response = myBufRead.readLine()) != null) {
                    Log.d(debugStr, "in while loop");
                    response = myBufRead.readLine();
                    Log.d(debugStr, String.valueOf(myBufRead.ready()));
                    Log.d(debugStr, myBufRead.readLine());
                    Log.d(debugStr, String.valueOf(myBufRead.ready()));
                }
                Log.d(debugStr, "out of while loop");
                myPrintWriter.close();
                myInputStreamRead.close();
                myBufRead.close();


            } catch (IOException e1) {
                e1.printStackTrace();
            }
            try {
                mySocket.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return null;
        }

    }


}

有人知道为什么会这样吗?任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    BuffereadReader.readLine() 是一种阻塞方法,因此它会等待,并且正如您所说,“停止”其线程,直到它有要读取的内容。从 pi 写入流后,您是否在调用 flush()

    另一个问题可能是readLine() 将等待一个完整的行,即它将等到它读取一个行分隔符。您是否从 pi 发送行分隔符?见Socket Multithreading - Reading input stream pauses thread

    您可以这样做(从 pi 端开始,假设您使用的是BufferedWriter):

    bufferedWriter.write(text);
    bufferedWriter.newLine();
    bufferedWriter.flush();
    

    【讨论】:

    • 感谢您的建议!这让事情变得更清楚了。我会测试一下,看看会发生什么。
    • 好吧,原来 pi 代码没有正确刷新,readLine 不知道什么时候停止,就像你说的那样。非常感谢!
    • readLine() 重新组合所有三个可能的行终止符。因此,您的最后一段不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2014-04-14
    • 2023-03-30
    相关资源
    最近更新 更多