【发布时间】:2016-12-21 01:48:22
【问题描述】:
我是安卓初学者。我正在尝试处理套接字。但是我的InputStream 没有按预期读取数据。在j = inputStream.read(arrayOfByte, 0, i);之后它正在退出方法请帮助我。
public void readinputstreamforid(final String ip, final int port){
AsyncTask asyncTask = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
try {
socket=new Socket(ip,port);
} catch (IOException e) {
e.printStackTrace();
}
final byte[] arrayOfByte = new byte[10000];
InputStream inputStream = null;
try {
inputStream = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
while (socket.isConnected()) {
int j = 0;
int i = arrayOfByte.length;
try {
j = inputStream.read(arrayOfByte, 0, i);
if (j == -1)
throw new IOException("not working");
if (j == 0)
continue;
} catch (IOException e) {
e.printStackTrace();
}
final String strData = new String(arrayOfByte, 0, j).replace("\r", "").replace("\n", "");
Log.d("hello","recieved: "+strData);
}
try {
IOUtils.write("!#@\n",socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
};
asyncTask.execute();
}
【问题讨论】:
-
如果发生错误,您正在记录它,但是您继续执行代码,然后可能会发生更多错误。发生错误时,停止并退出该功能。此外,您正在尝试在套接字断开连接后写入套接字的
OutputStream。你真的想用这段代码完成什么?您要处理什么样的数据?看起来您正在尝试阅读文本行。将InputStream包裹在BufferedReader中,然后您可以在循环中使用它的readLine()方法。 -
InputStream.read()在到达流的末尾时返回 -1。对于套接字,这意味着连接关闭时。这不是错误条件,所以不要抛出异常。打破循环。 -
感谢您的建议。但是当检查断点时,它既没有进入
if (j == -1),也没有给出任何错误。而且我也听从了你不抛出异常的建议,但它没有奏效。并且通过调试它显示套接字在读取时没有关闭。请帮助我。 @RemyLebeau -
“它既没有进入 if (j == -1) 也没有给出任何错误” - 这在物理上是不可能的。
read()抛出异常(您正在捕获但随后丢弃),或者它返回if然后评估的值。 -
j == 0表示您有一个错误:您为read()提供了零长度。continue是一种奇怪的处理方式。你的尝试捕捉很差。取决于先前try块中代码成功的代码应该在该try块内。不要写这样的代码。
标签: java android sockets inputstream