1

これには TCP ソケットを使用せざるを得ません。

いくつかのIPを照会し、そこから画像を取得してファイルに入れる必要があります。

私の実際のコードは次のようになります:

InetAddress ip = InetAddress.getByAddress(rawip); 
Socket socket = new Socket(ip, 80);
PrintWriter pw = new PrintWriter(socket.getOutputStream());

pw.println("GET "+ url +" HTTP/1.1");
pw.println("Host: " + m_url.substring(4));
pw.println("Connection: Close");
pw.println("User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36");
pw.println("");
pw.flush();


BufferedReader in = new BufferedReader(new InputStreamReader (socket.getInputStream()), 1);

String ln;
//Reading header
while((ln = in.readLine()) != null)
{
    //if header is finished
    if (ln.equals("")) break;
}

BufferedImage imgage = ImageIO.read(socket.getInputStream());

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( imgage, format, baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();

そして、次のエラーが表示されます。

java.lang.IllegalArgumentException: image == null!

以前はすべてのバイトを手動で読み取っていました。写真を取得していますが、最初にいくつかのバイト (約 7000) がありません。

それを機能させる方法は?

4

2 に答える 2

1

したがって、問題は次のようになります。

InputReader で 2 つのリーダーを使用することは安全ではありません。明示的に read を呼び出さなくても、最初の読み取りで一部のデータが消費される可能性があります。バッファをいっぱいに保ちます。

したがって、解決策は、両方に同じ準備ができているものを使用することです。

バイトリーダーを使用してヘッダーを削除することで修正しました。このバイトリーダーを使用して、写真を取得できました。

于 2013-07-19T19:44:42.460 に答える
0

これには Socket を使用しないでください。URL と HttpURLConnection を使用してください。それが目的です。コードに少なくとも 1 つの HTTP プロトコル エラーがあります。おそらく問題はありませんが、適切なクラスを使用していれば発生しません。

これを行うと、画像の一部を先読みしてバッファリングすることにより、ヘッダーを超えて読み取るために使用し、この問題を引き起こしている BufferedReader も削除されます。

于 2013-07-20T00:32:59.403 に答える