View Full Version : بررسی در دسترس بودن سرور
ho3ein.3ven
یک شنبه 05 مرداد 1393, 17:56 عصر
سلام
چطوری میتونم بررسی کنم که آیا یک آدرس خاص در دسترس هست یا نه ؟
در واقع چطوری میشه از یک آدرس پینگ گرفت ؟
Nevercom
یک شنبه 05 مرداد 1393, 18:39 عصر
این پاسخ در StackOverflow:
http://stackoverflow.com/a/2787214/1686304
این متد در Android SDK:
(public boolean isReachable (int timeout (http://developer.android.com/reference/java/net/InetAddress.html#isReachable(int))
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 00:29 صبح
ممنون از پاسختون .
در کد زیر از Z ارور میگیره :
private Boolean Ping(String address) {
try {
URL url = new URL(address);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION);
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
urlc.connect();
if (urlc.getResponseCode() == 200) {
return new Boolean(true);
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
چطور مشکلش رو رفع کنم ؟
Nevercom
چهارشنبه 08 مرداد 1393, 00:36 صبح
ظاهراً کد رو از جایی کپی کردید و اصلاً کلاس Z در پروژه ی شما وجود نداره.
اون خط اخمیت چندانی در این پروسه نداره و می تونید حذفش کنید و یا اصلاً اون قسمت مربوط به Z رو پاک کنید یا یه مقدار ثابت واسش بزارید.
Nevercom
چهارشنبه 08 مرداد 1393, 00:40 صبح
این کد چندان مناسب نیست، درواقع اگه این متد رو اجرا کنید خطا میده، چون باید عملیات در یک ترد دیگه انجام بشه، کد رو در یک AsyncTask یا Thread اجرا کنید
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 01:17 صبح
تشکر بابت پاسختون
برنامه نویسی مولتی ترد قبلا کار کردم ولی این مورد چون نوع بازگشتی داره نمیدونم چطوری بنویسمش .
امکانش هست راهنمایی کنید ؟
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 01:18 صبح
ظاهراً کد رو از جایی کپی کردید و اصلاً کلاس Z در پروژه ی شما وجود نداره.
همین کدی که خودتون معرفی کردین رو کپی کردم .
Nevercom
چهارشنبه 08 مرداد 1393, 02:16 صبح
برای اجرا در ترد دیگه می تونید از کلاس Thread استفاده کنید:
new Thread(new Runnable() {
@Override
public void run() {
}
}).run();
برای استفاده از مقدار برگشتی تابع می تونید یک field (یا member) در کلاس تعریف کنید و مقدارش رو داخل تابع ست کنید، یا از مکانیزم Handler استفاده کنید، یا از Interface استفاده کنید.
بنظرم برای این کار خاص همون field کفایت می کنه.
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 11:32 صبح
ممنون بابت پاسخ .
میشه مشکلم رو بهم بگین :
package com.example.ping;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
Boolean b=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread()
{
@Override
public void run() {
Ping("http://google.com");
}
}.run();
Toast.makeText(getApplicationContext(), b + "", 1).show();
}
private void Ping(String address) {
try {
URL url = new URL(address);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestProperty("User-Agent", "Android Application:"+1);
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
urlc.connect();
if (urlc.getResponseCode() == 200) {
// return new Boolean(true);
b=true;
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
b=false;
}
}
کرش می کنه .
Nevercom
چهارشنبه 08 مرداد 1393, 14:45 عصر
ببینید خطا از کدوم خطه. شاید از Toast باشه
ضمن اینکه اینطور که از کدتون پیداست، متغیر b همیشه مقدارش false خواهد بود، حتی اگر شرط برقرار بشه
b=false رو از آخر کد ببرید به قبل از try
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 15:24 عصر
این کد هم توی انجمن هست . ولی سرعتش خیلی پایینه .
public static boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
try {
URL url = new URL("http://www.google.com/");
HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
urlc.setRequestProperty("User-Agent", "test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(100); // Timeout
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
} else {
return false;
}
} catch (IOException e) {
Log.i("warning", "Error checking internet connection", e);
return false;
}
}
return false; }
حدود 10 ثانیه برنامه هنک می کنه تا از گوگل پینگ بگیره . چطور میشه اینو به صورت مولتی ترد نوشت و هنگامی هم که برنامه در حال دریافت اطلاعات هست یه پیغام لطفا منتظر بمانید بیاد
Nevercom
چهارشنبه 08 مرداد 1393, 15:48 عصر
این دوتا کد هیچ تفاوتی با هم ندارن، خط به خز شبیه هم هستن
ضمن اینکه من دیدم تو کدتون بعد از اجرای Thread فوراً مقدار متغیر رو در Toast سعی کردید نمایش بدید یا ازش استفاده کنید. نکته ای که باید بهش توجه کنید اینه که وقتی کد رو در یک ترد دیگه اجرا می کنید، برنامه منتظر نمیمونه که کار ترد تموم بشه و بعد ادامه ی کد رو اجرا کنه، یعنی نباید مقایسه رو به این شکل انجام بدید، بلکه در خود ترد باید انجام بشه یا از مکانیزم دیگه باید استفاده کنید.
این یعنی خط مربوط ب Toast زمانی که اجرا میشه، متغیر b هنوز مقدار جدید رو دریافت نکرده و کدتون اون عملکردی که فکر می کنید باید انجام بده رو انجام نمیده
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 16:00 عصر
دوست عزیز واقعا ممنون به خاطر وقتی که میزاری.
من یه کلاس async task برای پینگ نوشتم ولی جواب نمیده . میشه یه نگاهی بهش بندازین :
private ProgressDialog pd;
class isconnect extends AsyncTask<String, String, String> {
/**
* Before starting background thread
* Show Progress Bar Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
//showDialog(progress_bar_type);
pd = new ProgressDialog(getApplicationContext());
pd.setTitle("Processing...");
pd.setMessage("Please wait.");
pd.setCancelable(false);
pd.setIndeterminate(true);
pd.show();
}
/**
* Downloading file in background thread
* */
@Override
protected String doInBackground(String... f_url) {
ConnectivityManager cm = (ConnectivityManager)getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
try {
URL url = new URL("http://www.google.com/");
HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
urlc.setRequestProperty("User-Agent", "test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(100); // Timeout
urlc.connect();
if (urlc.getResponseCode() == 200) {
return "true";
} else {
return "false";
}
} catch (IOException e) {
Log.i("warning", "Error checking internet connection", e);
return "false";
}
}
return "false";
}
/**
* Updating progress bar
* */
protected void onProgressUpdate(String... progress) {
// setting progress percentage
// pDialog.setProgress(Integer.parseInt(progress[0]));
}
/**
* After completing background task
* Dismiss the progress dialog
* **/
@Override
protected void onPostExecute(String file_url) {
// dismiss the dialog after the file was downloaded
dismissDialog(progress_bar_type);
if (file_url=="true")
{
Connect=true;
}
else
{
Connect=false;
}
}
}
برای فراخونیش هم از کد زیر استفاده کردم :
new isconnect(); if(Connect==true)
new DownloadFileFromURL().execute(file_url);
}
Nevercom
چهارشنبه 08 مرداد 1393, 16:15 عصر
خب اولین خطایی که در نگاه اول به چشم من میاد، نحوه ی مقایسه ی String هست، برای مقایسه ی String از عملگر == استفاده نمیشه و باید از متد equals از کلاس String استفاده کنید:
if (file_url.equals("true"))
ho3ein.3ven
چهارشنبه 08 مرداد 1393, 16:26 عصر
ممنون . این مشکل رو رفع کردم ولی بازم جواب نمیده :
private ProgressDialog pd;
class isconnect extends AsyncTask<String, String, String> {
/**
* Before starting background thread
* Show Progress Bar Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
//showDialog(progress_bar_type);
pd = new ProgressDialog(getApplicationContext());
pd.setTitle("Processing...");
pd.setMessage("Please wait.");
pd.setCancelable(false);
pd.setIndeterminate(true);
pd.show();
}
/**
* Downloading file in background thread
* */
@Override
protected String doInBackground(String... f_url) {
ConnectivityManager cm = (ConnectivityManager)getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
try {
URL url = new URL("http://www.google.com/");
HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
urlc.setRequestProperty("User-Agent", "test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(100); // Timeout
urlc.connect();
if (urlc.getResponseCode() == 200) {
return "true";
} else {
return "false";
}
} catch (IOException e) {
Log.i("warning", "Error checking internet connection", e);
return "false";
}
}
return "false";
}
/**
* Updating progress bar
* */
protected void onProgressUpdate(String... progress) {
// setting progress percentage
// pDialog.setProgress(Integer.parseInt(progress[0]));
}
/**
* After completing background task
* Dismiss the progress dialog
* **/
@Override
protected void onPostExecute(String file_url) {
// dismiss the dialog after the file was downloaded
dismissDialog(progress_bar_type);
if (file_url.equals("true"))
{
Connect=true;
}
else
{
Connect=false;
}
}
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.