2012-07-15 27 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会为你做。