2013-02-10 84 views
2

我有一個簡單的TCP serversocket將獲得一個字節數組。這GET來自一個包含IMG SRC鏈接GIF圖像此服務器上進入網站時,請求如下:在瀏覽器中顯示字節數組中的圖像

GET /myHome.htm HTTP/1.1 
GET /house.gif HTTP/1.1 

現在字節數組做這樣的:

byte[] fileByte = Files.readAllBytes(filePath); 

要打印包含該圖片我做到這一點的網站:

out.writeBytes(new String(fileByte)); 

出來:

DataOutputStream out= new DataOutputStream(socketClient.getOutputStream()); 

現在使圖像顯示,我想我不得不使用別的東西,然後

out.writeBytes() 

,但我不知道。任何人都知道如何使圖像顯示?現在圖像根本不顯示。

+0

'new String(fileByte)'-shudders-永遠不要這樣做。一個字節數組不是字符串。 – leonbloy 2013-02-10 23:28:10

+0

但它適用於html ^^ – jt123 2013-02-10 23:30:12

+0

一個字符串是文本。 html是文本。圖像不是。 – leonbloy 2013-02-11 00:51:05

回答

2

首先,確保你的GIF文件沒有損壞。 (也發生在我之前)。

如果是這樣的話,試試這個代碼發送GIF文件:

byte[] fileByte = Files.readAllBytes(filePath); 
writer.writeBytes("HTTP/1.1 200 OK\r\n"); 
writer.writeBytes("Content-Type: image/gif\r\n"); 
writer.writeBytes("Content-Length: "+fileByte.length+"\r\n"); 
writer.writeBytes("\r\n"); 
writer.write(fileByte, 0, fileByte.length); 

,然後嘗試導航到「house.gif」的,而不是直接「myHome.htm」。讓我知道這是什麼。

以前的答案的嘗試:

我想我可能誤解了你的問題。讓我嘗試一個不同的答案:

你不知道如何弄清楚服務器何時返回HTML文件myHome.htm以及何時返回house.gif?

我認爲你需要簡單地解析出所請求的URL。只要檢查它是否包含「house.gif」。然後,根據這一點,不管是你上述返回的HTML文件,或者你發送的.gif文件,確保您使用

writer.write(fileByte, 0, fileByte.length); 

發送二進制數據,您設置一個回覆

Content-Type: image/gif 

在這兩種情況下,頭(HTML文件和GIF文件),但是,你應該在前面加上你用正確的HTTP響應頭髮送數據。不要把頁面標題錯誤的方式,但這個網站可能會有所幫助:http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

而只是爲了確保:您的服務器將收到兩個獨立的請求。第一個將要求提供HTML文件,第二個將要求提供GIF文件。所以你發送一個或另一個。所以,沒有「特殊方式」發送GIF而不是HTML文件。你使用相同的clientSocket。但它是一個不同的聯繫。

前面的答案(S):

我想你可能會缺少MIME類型的返回的數據。嘗試添加下面的HTTP標頭到您的回覆:

Content-Type: image/gif 

其實......你發送的所有正確的HTTP應答(包括標題,具體內容長度)?如果沒有,給我發一條評論,我會發布你需要的代碼。

如果出於某種原因無法設置內容類型頭讓瀏覽器知道您正在向其發送圖像,則可以使用XMLHttpRequest將客戶端上的二進制數據加載到JavaScript函數中而不是將其指定爲img標記的源Url。然後,您可以使用JavaScript將二進制數據編碼爲具有正確MIME類型的dataURI(http://en.wikipedia.org/wiki/Data_URI_scheme),並將其設置爲圖像的來源。

其實,我只注意到在你的代碼的東西:

new String(fileByte) 

可能會將fileBytes爲Unicode字符,而不是二進制。然後,當你寫這個給作者時,它可能會把它搞砸,因爲並不是圖像中的所有數據都是有效的unicode。嘗試用此代替行:

writer.write(fileByte, 0, fileByte.length); 

也許這就是你需要做的所有修復它?

+0

嘗試使用瀏覽器的調試工具查看服務器和瀏覽器之間的流量。 (Firebug,右鍵單擊 - >檢查元素等)我不認爲有可能簡單地向瀏覽器發送一些圖像的二進制數據,並確定它的格式是什麼,而不指定「image/gif」作爲標題中的元類型。即使它適用於某些瀏覽器,它絕對不會。但讓我給你的答案增加一些你也可以做的事情。 – 2013-02-10 23:01:34

+0

剛剛意識到另一個更簡單的事情,那可能是錯誤的(見答案)。先試試! – 2013-02-10 23:07:45

+0

我想我可以接受所有的mimetypes:Accept:\ */\ * – jt123 2013-02-10 23:23:05