2011-08-01 6 views
0

私はアプリを作った。 GoogleのC2DMサービスを使用するAndroid用私は いくつかのチュートリアルからサーバーシミュレータを作ったとうまく動作します。私の 問題は、私はJava Servletを構築しようとしました。 Androidデバイス からメッセージを受信して​​登録IDを保存しますが、 https POSTリクエストをGoogle C2DMサーバーに送信しようとすると、常に はSocketTimeoutExceptionを取得します。フェッチ中のタイムアウト: https://android.clients.google.com/c2dm/send。 Androidの デバイスで同じものが動作している場合、なぜこのようなことが起こっているのかわかりません。コードは次のとおりです。C2DMでHTTP PostにSocketTimeoutExceptionを与える

//The AuthToken from Google Client Login 

String auth_key = TOKEN;  
StringBuilder postDataBuilder = new StringBuilder(); 

//some parameters to pass, I've checked and it's correct, it's working 
//with Fiddler 
postDataBuilder.append(PARAM_REGISTRATION_ID).append("=").append(REGISTRATION_ID); 
postDataBuilder.append("&").append(PARAM_COLLAPSE_KEY).append("=").append("0"); 
postDataBuilder.append("&").append("data.payload").append("=").append(URLEncoder.encode(message, UTF8)); 

byte[] postData = postDataBuilder.toString().getBytes(UTF8); 
URL url = new URL("https://android.clients.google.com/c2dm/send"); 

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 

conn.setRequestMethod("POST"); 
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); 

conn.setRequestProperty("Content-Length",Integer.toString(postData.length)); 
conn.setRequestProperty("Authorization", "GoogleLogin auth="+auth_key); 

OutputStream out = conn.getOutputStream(); 
out.write(postData); 
out.close(); 

int responseCode = conn.getResponseCode(); 
//here comes the error processing, but I can't reach it, because of 
//the exception. 



if (responseCode == 401 || responseCode == 403) { 

//.... 
} 

ありがとうございます。

答えて

0

最初に明らかになるのは、私が謝罪したことをお考えの場合は、プロキシサーバーの背後にいますか?会社のファイアウォール?もしそうならタイムアウトはまさに私が上記のコードで期待する症状です。 (これは常に私を捉えています!)

コードの後半(HttpURLConnection宣言から)を変更しないで、タイムアウトが表示されます。 (企業のファイアウォールの背後にある)私のシステム上で、私は200 OKを取り戻す二つの変更と次のようにHttpURLConnectionの工場に渡されたプロキシオブジェクトの

  • 追加:

    プロキシプロキシ=新しいプロキシ( Proxy.Type.HTTP、新しいInetSocketAddress( "..."、8080)); HttpURLConnection conn =(HttpURLConnection)url.openConnection(proxy);

  • 私のJVMによって信頼されていないC2DMサーバの証明書を受け入れます。テスト目的のために、Trusting all certificates using HttpClient over HTTPSで説明されているように、デフォルトのホスト名検証とTrustManagerをオーバーライドしました。プロダクションでは、より安全なソリューションを検討する必要があります。

私が見つけた別のもの;それは重要ではないようですが、http://code.google.com/android/c2dm/index.html#pushは、android.clients.google.comではなく、https://android.apis.google.com/c2dm/sendに投稿していると言います。代わりの

URL url = new URL("http://android.apis.google.com/c2dm/send"); 

URL url = new URL("https://android.apis.google.com/c2dm/send"); 

それは私のために働いた

0

は、私は同じ問題と、私がしようとした

に直面していました。