java - 输入流无法正常工作

标签 java android sockets inputstream

我是安卓初学者。我正在尝试在套接字上工作。但我的 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();
}

最佳答案

如果发生错误,您会记录它,但随后继续执行代码,可能会发生更多错误。当错误发生时,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();
}

关于java - 输入流无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945195/

相关文章:

android - Android和PC之间的音频路由会产生白噪声

c - 如何使用netlink进行IPC?

java - 静态对象数组在循环后获得相同的值

java - if (arraylist contains "1"&& string contains "1") 打印错误

android - 无法在 API 级别 23 以上添加运行时权限?

android - FileProvider.getUriForFile vs Uri.fromFile - 除了权限之外还有其他区别吗

c - 什么时候 char* 对于严格的指针别名是安全的?

java - 在java中,在lambda函数内部使用时,三元运算符是否被视为单行表达式?

java - 在哪里可以下载 JavaFX 场景生成器?

java - PHP API 中的语法错误