gpt4 book ai didi

java - Android Socket 读取问题

转载 作者:行者123 更新时间:2023-11-29 19:21:06 25 4
gpt4 key购买 nike

我创建了一个连接到 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 发送行分隔符吗?参见 Socket Multithreading - Reading input stream pauses thread

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

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

关于java - Android Socket 读取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42464787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com