繁体   English   中英

Android套接字读取问题

[英]Android Socket Read Problems

我创建了一个连接到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;
        }

    }


}

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

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

另一个问题可能是readLine()将等待完整的行,即它将等待直到读取行分隔符为止。 您要从pi发送一个行分隔符吗? 请参见套接字多线程-读取输入流可暂停线程

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM