我是android的初学者。我正在努力研究套接字。但是我的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();
}
答案 0 :(得分:1)
如果发生错误,您正在记录它,但随后您继续使用代码,然后可能会发生更多错误。发生错误时, STOP 循环并退出该功能。到达流末尾时,InputStream.read()
返回-1。对于套接字,这意味着连接关闭时。这不是一个真正的错误条件,因此您不需要抛出异常。打破循环。您可以将InputStream
包裹在BufferedReader
内,以便您可以使用其readLine()
方法而不是手动读取字节。
此外,在套接字已断开连接后,您正尝试写入套接字OutputStream
。那永远不会奏效。
尝试更像这样的事情:
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);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
OutputDataStream out = socket.getOutputStream();
do {
String data = in.readLine();
if (data == null)
break;
Log.d("hello", data);
IOUtils.write("!#@\n", out, StandardCharsets.UTF_8);
}
while (true);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
};
asyncTask.execute();
}