Как непрерывно отправлять и получать данные, не закрывая выходной поток?

Я делаю приложение, которое передает данные с помощью Wi-Fi между двумя устройствами, используя сервер точки доступа и клиентское соединение.

Я использую следующий код для отправки данных с клиента на сервер.

OutputStream stream = socket.getOutputStream();

                    stream.write("".getBytes());
                    ContentResolver cr = context.getContentResolver();


                    InputStream is = null;
                    try {
                        is = new ByteArrayInputStream(data.getBytes());
                    } catch (Exception e) {
                        Log.d("TEST", e.toString());
                    }
                    copyFile(is, stream);

Это мой метод копирования файла.

  public static boolean copyFile(InputStream inputStream, OutputStream out) {
            byte[] buf = new byte[1024];
            while (true) {
                try {
                    int len = inputStream.read(buf);
                    if (len != -1) {
                        out.write(buf, 0, len);
                    } else {

                        //out.flush();
//out.close();


                        return true;
                    }
                } catch (IOException e) {
                    Log.d("TEST","faaaaaaaaaaaaaaaa::::"+ e.toString());
                    return false;
                }
            }
        }

И это мой код на стороне клиента.

try {

                AppFonts.serverSocket = new ServerSocket(8988);
                Log.d("TEST", "Server: Socket opened0000000000");
                AppFonts.socket = AppFonts.serverSocket.accept();

            Log.d("TEST", "Server: connection done0000000000000000");
            //    OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());


            String gotData = convertStreamToString(AppFonts.socket.getInputStream());
            Log.d("TEST", "Server: Socket Files,,,,,,");
            Log.d("TEST", "server: copying files0000000000 " + gotData);

            return gotData;
        } catch (IOException e) {
            Log.e("TEST", "fsat , " + e.getMessage());
            e.printStackTrace();
            return null;
        } catch (Exception e2) {
            e2.printStackTrace();
            return null;

        }

В методе copyFile() я попробовал out.flush(), но данные не получены на стороне клиента.

--

  • Я не хочу закрывать выходной поток, потому что мне нужно больше связи между двумя устройствами.
  • когда я использую данные out.close();, успешно отправленные клиенту, но без использования этих данных они не достигают клиента.
  • Сервер отправляет данные клиенту из метода copyFile(). Данные, полученные со стороны клиента, именно то, что отправляется, когда я использую outputstream.close(); но ничего не происходит, когда я удаляю outputstream.close(); или/и использовать outputstream.flush();. Я попробовал метод flush(), увидев Android: сокет закрыт по этой ссылке.

person Yadav Uttam    schedule 20.09.2017    source источник
comment
Название вашего вопроса не имеет ничего общего с вашей проблемой. Вы говорите, что данные не получены на стороне клиента, но сервер не отправляет никаких данных. Кроме того, вы не говорите, что получено сервером.   -  person President James K. Polk    schedule 21.09.2017
comment
Сервер отправляет данные клиенту из метода copyFile(). Данные, полученные со стороны клиента, именно такие, какие отправляются, когда я использую outputstream.close();, но ничего не происходит, когда я удаляю outputstream.close(); и/или использую outputstream.flush();. Я попробовал метод flush(), увидев stackoverflow.com/questions/14478450/ android-socket-is-closed по этой ссылке.   -  person Yadav Uttam    schedule 21.09.2017
comment
Я использую следующий код для отправки данных с клиента на сервер. Так это клиентский код, верно? И код на стороне сервера — это сторона с серверным сокетом, который, как вы сказали, был на стороне клиента, верно? Возможно, вам следует отредактировать свой вопрос, чтобы уточнить его.   -  person President James K. Polk    schedule 21.09.2017


Ответы (1)


Чтобы иметь непрерывную потоковую передачу данных, вы можете сделать что-то вроде этого

Timer scheduler = new Timer();
scheduler.scheduleAtFixedRate(task,1000,1000);

final Runnable task = new Runnable() {
   public void run() {
       try {
           is = new ByteArrayInputStream(data.getBytes());
       } catch (Exception e) {
           log.d("TEST", e.toString());
       }
   }
};

чтобы постоянно получать обновленный поток данных.

Закрытие выходного потока не означает, что данные, поступающие в поток, больше не будут вам доступны. Это означает, что поток вывода, который вы использовали, был освобожден из вашей памяти, и для чтения новых данных вам необходимо прочитать следующий поток данных.

person vivek jha    schedule 20.09.2017
comment
Я хочу двухстороннее общение, не хочу отправлять только с одной стороны. и закрытие выходного потока означает, что запись данных в поток завершена, и теперь их можно отправить получателю, но когда я закрываю выходной поток, сокет закрывается, поэтому мне приходится повторно подключать его для повторной отправки данных, и это не лучшая практика кодирования. - person Yadav Uttam; 21.09.2017
comment
Сервер будет ожидать любых подключений, когда вы вызываете accept(). Я предлагаю вам внимательно прочитать эту ссылку. docs.oracle.com/javase/tutorial/networking/sockets/. Это развеет многие ваши сомнения - person vivek jha; 21.09.2017