InputStream无法正常工作

时间:2016-08-14 18:18:10

标签: java android sockets inputstream

我是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();
}

1 个答案:

答案 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();
}