0

現在、私は次のコードを持っていますが、描画機能を繰り返さずにホストからの受信データを読みたいことを除いて、すべて問題ありません。特に、私が書いているプログラムには描画機能が必要ないためです。while ループが機能していないようです...

import processing.net.*;

String data;
Client c;
String hostvar;
String getReq;


void setup() {

  hostvar = "www.processing.org";  
  getReq = "/reference";

  c = new Client(this, hostvar, 80); // Connect to server on port 80

    //c.write("GET / HTTP/1.1\r\n"); // Use the HTTP "GET" command to ask for a Web page

  c.write("GET "+ getReq + " HTTP/1.1\r\n");
  c.write("Host:" + hostvar + "\r\n"); 
  c.write("User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.12; en-US; rv:1.9.0.7) Gecko/2009021906 Firefox/3.0.7\n");
  c.write("\r\n");

  while (c.available() > 0) { // This code doesn't work. .
    data = c.readString(); // // This code doesn't work. .
    println(data); // This code doesn't work. .
  }// This code doesn't work. .
}

void draw() {

    if (c.available() > 0) { // If there's incoming data from the client...
      data = c.readString(); // ...then grab it and print it  //this code works...
      println(data);
    }
}
4

3 に答える 3

1

最善の方法は、おそらく Apache HttpComponents-Clientを使用することです。ここから最新の「バイナリ」zip ファイルをダウンロードします。それを開き、「lib」フォルダー内のすべての jar ファイルを見つけます。次に、ここで説明されているように、これらを処理 IDE に直接ドラッグします。その後、「examples」フォルダー内のコードを使用できるようになります。ここに簡単なものがあります:

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

void setup() {

  CloseableHttpClient httpclient = HttpClients.createDefault();
  HttpGet httpGet = new HttpGet("http://targethost/homepage");
  CloseableHttpResponse response1 = httpclient.execute(httpGet);

  try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();

    // do something with the response body,
    // then ensure it is fully consumed

    EntityUtils.consume(entity1);
  } 
  finally {
    response1.close();
  }

}
于 2013-10-05T08:30:43.163 に答える
1

これも動作するはずですが (jar をいじりたくない場合)、要求ヘッダーを調整して、必要な「実際の」ブラウザーのように見せる必要がある場合があります。

import java.io.*;
import java.net.*;

void setup() {
  String s = getHTML("http://www.processing.org/reference");
  println(s);
}

String getHTML(String url) {

  String line, result = "";

  try {
    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
    conn.setRequestMethod("GET");
    setRequestHeaders(conn);
    BufferedReader rd = new BufferedReader
      (new InputStreamReader(conn.getInputStream()));
    while ( (line = rd.readLine ()) != null) {
      result += line;
    }
    rd.close();
  } 
  catch (Exception e) {
    e.printStackTrace();
  }

  return result;
}

void setRequestHeaders(HttpURLConnection conn)
{
  String ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5";
  conn.setRequestProperty("User-Agent", ua);
  conn.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
  conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
  conn.setRequestProperty("Connection", "keep-alive");
  conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
}
于 2013-10-05T08:44:18.437 に答える
1

データを取得するだけの場合:

void setup() {

  String hostvar = "http://www.processing.org/reference";
  println(join(loadStrings(hostvar),"\n"));
}

または、結果をブロック/待機したくない場合:

void setup() {

  new Thread() {
    public void run() {
      String hostvar = "http://www.processing.org/reference";
      println(PApplet.join(loadStrings(hostvar),"\n"));
    }
  }.start();

}
于 2013-09-25T14:34:16.273 に答える