2013-04-28 50 views
-1

我想從android手機(客戶端)到PC(服務器)之間發送兩個差異爲5秒的圖像。 我正在使用InputStream爲我做這個。InputStream明確接收兩次文件

 ServerSocket servsock = new ServerSocket(27508); 
     Socket sock = servsock.accept(); 
     System.out.println("connection accepted "); 
     int count; 

     FileOutputStream fos = null; 
     BufferedOutputStream bos = null; 
     InputStream is = null; 
     is = sock.getInputStream(); 

     int bufferSize = sock.getReceiveBufferSize(); 


     byte[] bytes = new byte[bufferSize]; 
     System.out.println("Here1"); 
     fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg"); 
     bos = new BufferedOutputStream(fos); 
     imgNum++; 
     while ((count = is.read(bytes)) > 0) 
     { 
      bos.write(bytes, 0, count); 
      System.out.println("count: " + count); 
     } 
     bos.flush(); 


     bytes = new byte[bufferSize]; 
     System.out.println("Here2"); 
     fos = new FileOutputStream("D:\\fypimages\\image" + imgNum + ".jpeg"); 
     bos = new BufferedOutputStream(fos); 
     imgNum++; 
     while ((count = is.read(bytes)) > 0) 
     { 
      bos.write(bytes, 0, count); 
      System.out.println("count: " + count); 
     } 
     bos.flush(); 


     System.out.println("Here3"); 

問題是is.read(bytes)塊只對所述第一圖像的代碼,然後結束程序,它不用於第二圖像塊。

我知道它返回-1當第一個圖像完全收到,但我如何使它第二次工作?

+0

這只是您自己以前的問題的轉發[使用InputStream通過TCP套接字接收多個圖像](http://stackoverflow.com/questions/16189128/recieving-multiple-images-over-tcp-socket-using- inputstream) – EJP 2013-04-28 22:52:20

回答

1

如果read返回-1,則表示另一端關閉連接。但是,您的基本問題似乎是,您並未將流式處理爲連接。在數據流中,沒有固有的「包」,在這種情況下,沒有內置的方法來區分一個圖像和下一個。

可以在至少3種不同的方式來進行:

  • 添加您自己的簡單的協議,例如:在發送端,寫在圖像的字節數,然後寫圖像字節,則寫入的字節數在下一張圖片中,然後寫下一張圖片等,而不關閉連接。在接收端,首先讀取字節數,然後讀取很多字節的圖像數據。
  • 每個連接寫一個圖像,然後關閉連接併爲下一個圖像創建新連接。
  • 在這種情況下,由於數據是JPEG圖像,只需將所有JPEG圖像寫入一個數據流,然後在接收端解析JPEG格式以查看圖像邊界在哪裏。

第一選擇是最有效的,也很容易擴展到除圖像文件長度外還提供圖像名稱或其他額外數據。其次是確定的,並且最簡單和健壯(例如,不需要擔心字節順序,或者擔心發送者和接收者之間不同步),如果沒有太多圖像,但是如果有數百個圖像,那麼重新連接會讓事情減慢一點。第三種選擇可能不是用JPEG製作的方式,只是將其列爲可能。

+0

如果我沒有任何固定數量的圖像發送,那麼怎麼辦?我可以在不關閉連接並重新連接的情況下完成任務嗎? – Saaram 2013-04-28 10:38:10

+0

我也提到發送兩個圖像之間有5秒的差異,所以第一個可能不會工作? – Saaram 2013-04-28 10:42:24

+0

具有固定數量的圖像應該沒有關係。在讀取最後一張圖片並嘗試接收下一個長度之後,第一種方法是這樣做,'read'將返回'-1',因爲發送者可能已經關閉了連接。對於任何方法,5秒的延遲都不應該造成影響,因爲如果需要,讀取將會被阻止,但是以這種圖像速度,爲每個圖像建立一個新連接也不應該是個問題(它會延長几毫秒的延遲時間,但這很可能在你的用例中無關)。 – hyde 2013-04-28 14:20:02