使用android的socket和服务端通信
通常在使用socket和服务端的通信时,在调用getInputStream的read方法时,通常会造成阻塞。如下代码
try {
LogUtil.e("发送...");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(mOutputStream));
bufferedWriter.write(feedbackLog);
bufferedWriter.flush();
// bufferedWriter.close();
LogUtil.e("接收...");
BufferedInputStream bufferedReader = new BufferedInputStream(mInputStream);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int r=-1;
byte buff[] =new byte[1024];
while((r =bufferedReader.read(buff,0,1024))!=-1)
{
LogUtil.e("------rc:"+r );
byteArrayOutputStream.write(buff,0,r);
}
//程序不会在这里执行,而是一在while循环内一直阻塞。
String re =new String(byteArrayOutputStream.toByteArray());
LogUtil.e("完成:"+re);
} catch (IOException e) {
e.printStackTrace();
LogUtil.e("FeedbackSocekt send exception "+e.getMessage());
}
客户端一直阻塞。这里的解决办法是,在读取了之后,判断当前的流是否还有,如果没有了,则跳出循环
try {
LogUtil.e("发送...");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(mOutputStream));
bufferedWriter.write(feedbackLog);
bufferedWriter.flush();
// bufferedWriter.close();
LogUtil.e("接收...");
BufferedInputStream buffered = new BufferedInputStream(mInputStream);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int r=-1;
byte buff[] =new byte[1024];
while((r =buffered .read(buff,0,1024))!=-1)
{
LogUtil.e("------rc:"+r );
byteArrayOutputStream.write(buff,0,r);
if(buffered .available() <=0) //添加这里的判断
{
break;
}
}
String re =new String(byteArrayOutputStream.toByteArray());
LogUtil.e("完成:"+re);
} catch (IOException e) {
e.printStackTrace();
LogUtil.e("FeedbackSocekt send exception "+e.getMessage());
}
如上,给循环内添加一个判断,如果还有可读的,则继续读取,如果没有了,则跳出循环。
这里参考的是How to unblock InputStream.read() on Android?