2017-09-20 136 views
0

我正在使用熱點服務器和客戶端連接在兩臺設備之間使用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()方法中,我嘗試了out.flush(),但數據未在客戶端接收。

-

  • 我不想收的OutputStream,因爲我想在兩個設備之間更多的交流。
  • 當我使用out.close();數據成功發送到客戶端,但沒有使用該數據沒有達到客戶端。
  • 服務器從copyFile()方法向客戶端發送數據。從客戶端收到的數據與使用outputstream.close()時發送的內容完全相同。但是當我刪除outputstream.close()時沒有任何反應。或/和使用outputstream.flush();.在看到Android: Socket is closed這個鏈接後,我嘗試了flush()方法。
+0

問題的標題與您的問題無關。你說客戶端沒有收到數據,但服務器不發送任何*數據。另外,你不會說服務器收到了什麼*。 –

+0

服務器從copyFile()方法向客戶端發送數據。從客戶端收到的數據與使用outputstream.close()時發送的數據完全一致;但是當我刪除outputstream.close();或者使用outputstream.flush()時,什麼都不會發生。在看到https://stackoverflow.com/questions/14478450/android-socket-is-closed這個鏈接後,我嘗試了flush()方法。 –

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

爲了不斷獲取數據的更新流。

關閉輸出流並不意味着流中的數據將不再提供給您。這意味着您正在使用的輸出流已從您的內存中解除分配,並且爲了讀取您需要讀取下一個數據流所需的新數據。

+0

我希望雙方的溝通不要只從一方發送。並關閉輸出流意味着寫入數據流完成,現在它可以發送到接收器,但當我關閉輸出流套接字關閉,所以我不得不重新連接它再次發送數據,這不是最好的編碼習慣。 –

+0

當您調用accept()時,服務器將等待任何連接。我建議你仔細閱讀這個鏈接。 http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html。這將清除你的許多疑問 –

相關問題