JAVAアプリケーション開発記録

いずれはシェアウェア作家。今はがらくたメーカー。

このページでは、私が作ったJavaアプリケーションの製作日記を載せています。

できるだけソースコードもそのまま載せていますので、カスタマイズしてもっといいアプリにしてやってください。

第1作目(04/08/02) 「Rss Ping」アプリケーション

別のページ(「RSS Ping」で「アクセスアップ」)で紹介している「RSS Ping」をうつJavaアプリケーションのプログラムです。

「RSS Ping」とは、基本的に「RSS Ping」フォーマット(『本サイトのRSS pingファイル』のサンプルは、こちら)で書かれたファイルを「RSS Ping」を受け付けるサーバに対して「POST」メソッドで送りつけることになります。

JavaでHTTPでの接続を行うときには「HttpURLConnection」クラスを使用します。

「HttpURLConnectoin」を用いたもっともシンプルな接続例は、以下のようになります。

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.ProtocolException;

public class GetWebPage {
     public static void main(String[] args) {
          HttpURLConnection con=null;
          URL url=null;
          
          // proxy経由の場合、以下でproxy ホスト名、ポート番号をセット
          // System.setProperty("http.proxyHost","hoge.com"); 
          // System.setProperty("http.proxyPort","8080");

          // ターゲットのURLを生成
          try{
               url=new URL("http://hara.hore.hire/hare.html");
          }catch(MalformedURLException e){
               e.printStackTrace();
          }

          // コネクション生成(この時点では、接続されていない)
          try {
               con=(HttpURLConnection) url.openConnection();
               con.setRequestMethod("GET");
               HttpURLConnection.setFollowRedirects(false);
               con.setInstanceFollowRedirects(false);
          } catch (ProtocolException e1) {
               e1.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }
          // 全ての設定が終了したので接続 
          try {
               con.connect();
          } catch (IOException e) {
               e.printStackTrace();
          }

          // ウェブサイトからのレスポンス読み込み
          BufferedReader br;
          String fld;
          try {
               br=new BufferedReader(new InputStreamReader(con.getInputStream()));
               while((fld=br.readLine())!=null){
                    System.out.print(fld);
               }
          } catch (IOException e) {
               e.printStackTrace();
          }

          // 切断
          con.disconnect();
     }
}

上記は「GET」メソッドでのウェブページ取得ですが、「RSS Ping」の場合は、「POST」メソッドを用いますので、以下のような変更が必要です。

まず、コネクションの生成ですが、HttpURLConnectionクラスのインスタンス取得には、「コネクションのメソッド」と「URLのインスタンス」が必要になります。それぞれを「method」「url」とすると以下のソースでコネクションの生成ができます。

private void getConnection(String method, URL url){
     try {
          con=(HttpURLConnection) url.openConnection();
          con.setRequestMethod(method);
          HttpURLConnection.setFollowRedirects(false);
          con.setInstanceFollowRedirects(false);
     } catch (ProtocolException e1) {
               e1.printStackTrace();
     } catch (IOException e) {
          e.printStackTrace();
     }
}

上記のメソッドは、"getConnection("POST", rssPingString)"といったように使用します。

ちなみに、setFollowRedirectsは、ページが別の所に転送される場合にそれを追いかけるかどうかの設定です。

HttpURLConnectionのインスタンス取得ができたら、後は送信する「データ」と「ヘッダ」を設定し送り出すことになります。

「Rss Ping」の場合、フォーマットが決まっているので、まずデータを以下のように作成します。

private String makeRssString(){
     StringBuffer rssPingString=new StringBuffer();
     rssPingString.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>");
     rssPingString.append("weblogUpdates.ping</methodName><params><param><value>");
     rssPingString.append(pageTitleString);
     rssPingString.append("</value></param><param><value>");
     rssPingString.append(pageURLString);
     rssPingString.append("</value></param></params></methodCall>");

     return rssPingString.toString();
}

ここで使用される「トップ・ページタイトル:pageTitleString」と「トップ・ページURL:pageURLString」は、今回はアプリケーションの初期化の所で決めうち設定しました。

private void cleanupFirst(){ 
     // サイトのトップページのタイトル
     pageTitleString=new String("はらほれひれはれ");
     // サイトのトップページのアドレス
     pageURLString=new String("http://harahore.hirehare/");
     // Rss Pingのフォーマット設定
     rssPingString=this.makeRssString();

     // proxy経由の場合、以下でproxy ホスト名、ポート番号をセット
     //System.setProperty("http.proxyHost",""); 
     //System.setProperty("http.proxyPort","");
     
     // ping受信サーバを登録
     try {
          pingURL[0]=new URL("http://ping.cocolog-nifty.com/xmlrpc");
          pingURL[1]=new URL("http://www.blogpeople.net/servlet/weblogUpdates");
          pingURL[2]=new URL("http://ping.bloggers.jp/rpc/");
          pingURL[3]=new URL("http://ping.myblog.jp");
          pingURL[4]=new URL("http://bulkfeeds.net/rpc");
          pingURL[5]=new URL("http://blog.goo.ne.jp/XMLRPC");
     } catch (MalformedURLException e) {
          e.printStackTrace();
     }
}

ここでは、「RSS Ping」受信サーバのURLも設定しています。

設定した出力用データは、「HttpURLConnection」から、出力用ストリーム「OutputStreamWriter」を取得してそこにデータを流し込むことにより実現します。

private void putOutTheStream(String str){
     //出力することを示すためのフラグをセットする(DoOutput)
     con.setDoOutput(true);
     try {
          osw=new OutputStreamWriter(con.getOutputStream());
          osw.write(str);
          osw.flush();
          osw.close();
     } catch (IOException e) {
          e.printStackTrace();
     }
}

リクエストヘッダは、生成したコネクションから設定を行います。

     con.setRequestProperty("Content-type","text/xml");

全ての設定が終わったら「HttpURLConnection#connection()」を呼び出して接続します。

private void putOutTheStream(String str){
     con.setDoOutput(true);
     try {
          osw=new OutputStreamWriter(con.getOutputStream());
          osw.write(str);
          osw.flush();
          osw.close();
     } catch (IOException e) {
          e.printStackTrace();
     }
}

接続後に相手から送られてくるデータは、「HttpURLConnectoin」から得た入力用ストリーム「InputStreamReader」を経由して取得します。

private void wasteTheResponse(){
     try {
          Thread.sleep(500);
     } catch (InterruptedException e1) {
          e1.printStackTrace();
     }
     BufferedReader br;
     String fld;
     try {
          br=new BufferedReader(new InputStreamReader(con.getInputStream()));
          while((fld=br.readLine())!=null){
               System.out.print(fld);
          }
     } catch (IOException e) {
          e.printStackTrace();
     }
     con.disconnect();
}

最終的に、「RSS Ping」アプリケーションは、以下のようになりました。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class RssPing {
     private URL[] pingURL=new URL[7];
     private String pageTitleString;
     private String pageURLString;
     private String rssPingString;
     private HttpURLConnection con;
     private OutputStreamWriter osw;
     
     RssPing(){
          this.cleanupFirst();
          this.cleanup();
     } 
     //全ての必要情報を始めにセットアップ
     private void cleanupFirst(){
          pageTitleString=new String("はらほれひれはれ"); // サイトのトップページのタイトル
          pageURLString=new String("http://harahore.hirehare/"); // サイトのトップページのアドレス
          rssPingString=this.makeRssString();
          //System.setProperty("http.proxyHost",""); // proxy経由の場合 proxy ホスト名をセット
          //System.setProperty("http.proxyPort",""); // proxy経由の場合 proxy ポート番号をセット
          
          try { // ping受信サーバを登録
               pingURL[0]=new URL("http://ping.cocolog-nifty.com/xmlrpc");
               pingURL[1]=new URL("http://www.blogpeople.net/servlet/weblogUpdates");
               pingURL[2]=new URL("http://ping.bloggers.jp/rpc/");
               pingURL[3]=new URL("http://ping.myblog.jp");
               pingURL[4]=new URL("http://bulkfeeds.net/rpc");
               pingURL[5]=new URL("http://blog.goo.ne.jp/XMLRPC");
          } catch (MalformedURLException e) {
               e.printStackTrace();
          }
     }

     private String makeRssString(){
          StringBuffer rssPingString=new StringBuffer();
          rssPingString.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>");
          rssPingString.append("weblogUpdates.ping</methodName><params><param><value>");
          rssPingString.append(pageTitleString);
          rssPingString.append("</value></param><param><value>");
          rssPingString.append(pageURLString);
          rssPingString.append("</value></param></params></methodCall>");

          return rssPingString.toString();
     }

     private void cleanup(){
          con=null;
          osw=null;
     }

     private void getConnection(String method, URL url){
          try {
               con=(HttpURLConnection) url.openConnection();
               con.setRequestMethod(method);
               HttpURLConnection.setFollowRedirects(false);
               con.setInstanceFollowRedirects(false);
          } catch (ProtocolException e1) {
                    e1.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }
     }

     private void putOutTheStream(String str){
          con.setDoOutput(true);
          try {
               osw=new OutputStreamWriter(con.getOutputStream());
               osw.write(str);
               osw.flush();
               osw.close();
          } catch (IOException e) {
               e.printStackTrace();
          }
     }
     private void connection(){
          try {
               con.connect();
          } catch (IOException e) {
               e.printStackTrace();
          }
     }
     private void wasteTheResponse(){
          try {
               Thread.sleep(500);
          } catch (InterruptedException e1) {
               e1.printStackTrace();
          }
          BufferedReader br;
          String fld;
          try {
               br=new BufferedReader(new InputStreamReader(con.getInputStream()));
               while((fld=br.readLine())!=null){
                    System.out.print(fld);
               }
          } catch (IOException e) {
               e.printStackTrace();
          }
          con.disconnect();
     }

     private void updateIt(){
          for(int i=0;i<6;i++){ // ping受信サーバの数だけ繰り返し
               cleanup();
               getConnection("POST",pingURL[i]);
               con.setRequestProperty("Content-type","text/xml");
               putOutTheStream(rssPingString);
               connection();
               wasteTheResponse();
               System.out.println();
          }
     }
     public static void main(String[] args) {
          RssPing thisApp=new RssPing();
          thisApp.updateIt();
     }
}