2012-07-15 42 views
0

幾天前,我想編寫我自己的圖像客戶端,通過HTTP直接傳輸圖像。我用Google搜索和研究相當長的一段時間,寫我的服務器:Java圖像服務器:套接字寫入錯誤

public class SConnection extends Thread { 

    Socket client; 

    /* ... */ 

    @Override 
    public void run() { 

     while(true) { 
      try { 

       //Get some image paths 
       File folder = new File(new java.net.URI("file:///C:/images/")); 
       File[] images = folder.listFiles(); 
       //Load the image 
       BufferedImage bi = ImageIO.read(images[0]); 
       //Write the image 
       ImageIO.write(bi, "JPEG", client.getOutputStream()); 

      } catch (Exception ex) { 

       ex.printStackTrace(); 
       return; 

      } 

     } 

    } 

的主類是等待接受多個連接,將它們存儲在一個ArrayList,創造SConnection的實例,並開始他們一個線程。

客戶看起來是這樣的:

URL target = new URL("http://127.0.0.1:82"); //The server - so far, so good 
URLConnection conn = target.openConnection(); 
BufferedImage in = ImageIO.read(conn.getInputStream()); //And as I try to receive the image: boom, exception 
File save = new File(new java.net.URI("file:///C:/images/result.jpeg")); 
ImageIO.write(in, "JPEG", save); 

服務器和客戶端發送位於ImageIO.write/ImageIO.read例外 - 線。

服務器說:

java.net.SocketException: Connection reset by peer: socket write error 

客戶說:

java.io.IOException: Invalid Http response 

我得到的,該圖像是不正確傳遞,但我應該怎麼改?任何線索?

謝謝你們,提前!

+0

我不確定這會有幫助,但您應該關閉URLConnection中的InputStream。我的猜測是ImageIO.read()不會爲你做。 – 2012-07-15 16:28:54

+0

您是否嘗試過簡單地在客戶端和服務器之間編寫文本?您可能會遇到防火牆或權限問題,從而無法打開套接字,而忽略ImageIO會使其更易於調試。 – Edward 2012-07-15 16:34:06

+0

jup,簡單的基於文本的通信炒作就好了。我的猜測是,協議l有問題,因爲我絕對不知道,客戶端和服務器實際上正在轉換,因爲它們傳輸圖像... 我在輸入流和輸出流上添加了閉合命令本身,但它仍然是一個例外.. – brickBreaker 2012-07-15 19:09:41

回答

0
  1. 你似乎並沒有被寫入HTTP頭,所以客戶端的URLConnection不會明白的答覆,將關閉連接,造成「通過對等連接復位」的發件人。

  2. 你不需要構造一個URI來打開一個文件。

  3. 根本不需要使用ImageIO。這只是浪費時間和空間。只需複製字節,就像其他任何文件類型一樣。

總之,你根本不需要這段代碼。默認的servlet會爲你做。