如何正确使用InputStream.read(缓冲)方法并处理我的数据?

时间:2014-09-10 15:38:22

标签: java android sockets buffer inputstream

我必须在Android中创建一个应用程序,用于将我的Galaxy S3与另一台设备连接起来,在这个答案中我称之为device1。我使用socket和InputStream。 - 首先:我使用socket连接我的手机,当建立连接时,device1发送一些我存储在一个缓冲区中的字符串。

  • 第二:我向device1发送一个“s”字符串,当device1接收到该字符串时,它会不间断地向我发送连续数据。

-tree:我想阅读这些数据并做一些阐述

问题是InputStream.read(缓冲区)是阻塞的,所以我收到数据但是我无法处理它。

这是我的代码:

public void run() {             

                try {
                    socket=new Socket();  
                    socket.connect(new InetSocketAddress(ipDevice,portDevice),20); //settare il timeout per evitare che tutto si blocchi su receive
                    String controllo="connesso";





                    showToast(controllo);
                    InputStream is = socket.getInputStream();
                    byte[] buffer_controllo = new byte[1024];
                                            int count_bytes_read;
                    char[] chars ;
                    String str;

                    count_bytes_read = is.read(buffer_controllo); //lettura del buffer

                    str=new String(buffer_controllo);
                    chars=new char[count_bytes_read];



                    OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
                    BufferedWriter bw = new BufferedWriter(osw);
                    PrintWriter out = new PrintWriter(bw, true);
                    out.write("s");
                    byte[] buffer_dati = new byte[1024];
                    int count_bytes_read2=0;
                    while(count_bytes_read2!=-1){
                    count_bytes_read2 = is.read(buffer_dati); //PROBLEM HERE
                    }
                    str=new String(buffer_dati);
                    chars=new char[count_bytes_read];

                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    String controllo="non connesso";
                    showToast(controllo);
                    try {
                        socket.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    e.printStackTrace();

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    String controllo="non connesso";
                    showToast(controllo);
                    try {
                        socket.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    e.printStackTrace();                    
                }  
                finally{
                    if(socket!=null){
                        try {
                            OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
                            BufferedWriter bw = new BufferedWriter(osw);
                            PrintWriter out = new PrintWriter(bw, true);
                            out.write("z");                 
                            out.flush();
                            socket.close();                         
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }

        });
        //Avvio del Thread
        cThread.start();

正如您所看到的那样:

count_bytes_read2 = is.read(buffer_dati);

这个读取方法是阻塞的,我从device1收到无限数量的数据,所以我不能拿我的缓冲区dati并对它做一些详细说明。 如何在执行read方法期间获取此数据?我必须阻止阅读一段时间或有其他解决方案吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

DataFetcher是我编写的用于处理这些问题的类。它是一个通过监听器/回调模式运行的线程式读取器......虽然它也可以用来完全读取流。我认为这可能有助于解决您的问题

答案 1 :(得分:0)

您的代码没有意义。您正在从流中读取直到流结束,然后才对数据执行任何操作。

数据处理应该在读取循环内部进行。

当然,如果设备无限发送,它将永远不会断开连接,因此流的结尾永远不会到达。