2016-04-20 41 views
0

考慮服務器B向服務器A(這是一個加密服務器)發出http請求並獲取輸出流(已加密)的情況。所以服務器B可以在這個加密流的幫助下編寫。是否可以發送輸出流作爲對http請求的響應?

現在這種加密輸出流將在服務器A被打開,並在服務器關閉B.

  1. 是否有可能在HTTP響應發送輸出流?

  2. 這是發送輸出流的正確方法嗎?或者是否有像輸出流這樣的約定必須在它所在的同一個服務器(或同一個應用程序)中關閉?

+0

你不 「送」 的輸出流。服務器將字節寫入其HTTP響應輸出流,以便客戶端可以接收其連接的輸入流中的字節。輸出流就像一個鍵盤:你用它來寫東西。 InputStream就像一個屏幕:你用它來閱讀事物。但是你不會發一個鍵盤給別人說點什麼。你在鍵盤上輸入它。 –

+0

非常感謝JB Nizet :)雖然我們有不同數據類型的變量來讀寫內存中的數據,但爲什麼我們要使用流呢?請幫助我知道這一點。 – lsof

+0

流很少用於在內存中寫東西。它主要用於將內容寫入磁盤或網絡。如果你有兩臺服務器,即使在同一臺機器上,它們也不共享相同的內存。存儲在一個進程中的變量不能從其他進程訪問。所以你需要通過網絡發送消息來進行通信。繼續比喻:你可以在你的房子裏爲你的妻子寫一封便條。但要告訴我一些事情,你需要通過網絡發送消息。 –

回答

0

是的,這是可能的。這就是文件下載的工作原理。

首先,您必須設置您要提供的Content-Type。如果它是簡單的二進制文件,然後將其設置爲application/octet-stream。之後得到outputStream的響應並轉儲文件內容。

像下面

response.setContentType("application/octet-stream"); 
response.setContentLength(fileSizeInBytes);//new File('myfile').length(), optional step 
response.getOutputStream().write(fileBytes);//do it in chunks 

#Edit

流是數據信道的端點。就像HTTP地址是服務器資源的端點一樣。

在流的情況下,我們的程序不需要知道實際資源的位置。我只需要知道如何與流進行交互。

因此,如果是HttpServletResponse流,數據位於您的服務器。客戶端的瀏覽器(或任何其他客戶端)與您的服務器建立連接。當我們像讀/寫一樣調用流上的方法時,通過此連接發送或接收數據。在HttpServletResponse的情況下這些調用導致通過TCP連接的HTTP分組傳輸。

有關Java Stream(或任何其他具有類似概念的語言)的更多信息,請查看此處。

https://docs.oracle.com/javase/tutorial/essential/io/streams.html

+0

非常感謝第11個維度。我無法想象outputStream是如何工作的。 我的理解方式是,它類似於指向地址的C中的指針變量,如果我們調用.write()方法,它將向它寫入數據。 如果我錯了,請糾正我。請幫助我清楚瞭解Streams。 – lsof

+0

更新了我的答案,看看。 – 11thdimension

+0

再次感謝11thdimensionion :)我仍然想澄清這些..我們有字符串 - 我們讀取字符串中的數據並將數據存儲在字符串中,就像其他數據類型一樣,用於讀寫內存中的數據 然後,我們爲什麼要來流?創建流的必要條件是什麼?請幫助我。 – lsof

相關問題