如何在不关闭输出流的情况下连续发送和接收数据?

时间:2017-09-20 12:53:25

标签: android sockets wifip2p

我正在制作使用热点服务器和客户端连接在两台设备之间使用wifi传输数据的应用程序。

我使用以下代码将数据从客户端发送到服务器。

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()方法中,我尝试过.flush()但是客户端没有收到数据。

-

  • 我不想关闭输出流,因为我想在两个设备之间进行更多通信。
  • 当我成功使用out.close();数据发送到客户端时,但未使用该数据无法到达客户端。
  • 服务器正在从copyFile()方法向客户端发送数据。从客户端收到的数据与我使用outputstream.close()时发送的内容完全相同;但是当我删除outputstream.close()时没有任何反应;或/并使用outputstream.flush();.在看到Android: Socket is closed此链接后,我尝试了flush()方法。

1 个答案:

答案 0 :(得分: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());
       }
   }
};

以便不断获取更新的数据流。

关闭输出流并不意味着流中的数据将不再可用。这意味着您正在使用的输出流已从内存中释放,并且为了读取您需要读取下一个数据流所需的新数据。