几天前,我想过编写自己的图像客户端,直接通过HTTP传输图像。我用Google搜索并研究了很长时间并编写了我的服务器:
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 :(得分:0)
您似乎没有编写HTTP标头,因此客户端URLConnection将无法理解回复并将关闭连接,导致发件人“通过对等方重置连接”。
您无需构建URI来打开文件。
您根本不需要使用ImageIO。这只是浪费时间和空间。只需复制字节,就像任何其他文件类型一样。
简而言之,你根本不需要这个代码。默认的servlet将为您完成。