我必须在Android中创建一个应用程序,用于将我的Galaxy S3与另一台设备连接起来,在这个答案中我称之为device1。我使用socket和InputStream。 - 首先:我使用socket连接我的手机,当建立连接时,device1发送一些我存储在一个缓冲区中的字符串。
-tree:我想阅读这些数据并做一些阐述
问题是InputStream.read(缓冲区)是阻塞的,所以我收到数据但是我无法处理它。
这是我的代码:
public void run() {
try {
socket=new Socket();
socket.connect(new InetSocketAddress(ipDevice,portDevice),20); //settare il timeout per evitare che tutto si blocchi su receive
String controllo="connesso";
showToast(controllo);
InputStream is = socket.getInputStream();
byte[] buffer_controllo = new byte[1024];
int count_bytes_read;
char[] chars ;
String str;
count_bytes_read = is.read(buffer_controllo); //lettura del buffer
str=new String(buffer_controllo);
chars=new char[count_bytes_read];
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter out = new PrintWriter(bw, true);
out.write("s");
byte[] buffer_dati = new byte[1024];
int count_bytes_read2=0;
while(count_bytes_read2!=-1){
count_bytes_read2 = is.read(buffer_dati); //PROBLEM HERE
}
str=new String(buffer_dati);
chars=new char[count_bytes_read];
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
String controllo="non connesso";
showToast(controllo);
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
String controllo="non connesso";
showToast(controllo);
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
finally{
if(socket!=null){
try {
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter out = new PrintWriter(bw, true);
out.write("z");
out.flush();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
//Avvio del Thread
cThread.start();
正如您所看到的那样:
count_bytes_read2 = is.read(buffer_dati);
这个读取方法是阻塞的,我从device1收到无限数量的数据,所以我不能拿我的缓冲区dati并对它做一些详细说明。 如何在执行read方法期间获取此数据?我必须阻止阅读一段时间或有其他解决方案吗? 谢谢。
答案 0 :(得分:0)
DataFetcher是我编写的用于处理这些问题的类。它是一个通过监听器/回调模式运行的线程式读取器......虽然它也可以用来完全读取流。我认为这可能有助于解决您的问题
答案 1 :(得分:0)
您的代码没有意义。您正在从流中读取直到流结束,然后才对数据执行任何操作。
数据处理应该在读取循环内部进行。
当然,如果设备无限发送,它将永远不会断开连接,因此流的结尾永远不会到达。