ورود

View Full Version : اشکال در استفاده از کانکشن اینترنت



rubiks.kde
یک شنبه 06 مرداد 1392, 00:42 صبح
سلام دوستان

من چند روزیه یه مشکل حسابی کلافم کرده اونم این که یه برنامه دارم که از سرور یه سری اطلاعات رو میگیره این اطلاعات توسط gzip توی سرور فشرده میشن و من توی برنامه اونا رو از فشرده گی خارج و استفاده میکنم به این صورت :
public JSONObject getInfo(String url){

HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.addHeader("Accept-Encoding", "gzip");
try {
HttpResponse response = client.execute(get);
InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");

if (contentEncoding.getValue().equalsIgnoreCase("gzip")) {

try {
instream = new GZIPInputStream(instream);

final int BUFFER_SIZE = 32;
GZIPInputStream gis = new GZIPInputStream(instream, BUFFER_SIZE);
StringBuilder string = new StringBuilder();
byte[] data = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = gis.read(data)) != -1) {
string.append(new String(data, 0, bytesRead));
}
gis.close();

String str = string.toString();

JSONObject jobj = new JSONObject(str);
return jobj;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} finally {
instream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
return null;
}

return null;

}


ولی مشکل اینه که این کد زمانی برام درست کار میکنه که یا با wifi وصل شده باشم یا gprs بدون پروکسی
مثلا اگه تنطیمات ایرانسل برای gprs رو دیده باشید یه پروکسی و پورت داره که اگه این دو مورد ست شده باشن این تابع درست کار نمیکنه و توی خط
GZIPInputStream gis = new GZIPInputStream(instream, BUFFER_SIZE);
خطا میده که فرمت درست نیست و باید خط زیر رو کامنت کنم تا درست بشه
instream = new GZIPInputStream(instream);

ولی موقعی که این خط رو کامنت میکنم بعد با wifi وصل میشم همون خطای بالا رو میده و باید این خط رو بزارم.

این مشکل این چند روز حسابی کلافم کرده اگه دوستان کمک کنن بسیار ممنون میشم.

darkenerboy
یک شنبه 06 مرداد 1392, 00:49 صبح
سلام
من که تا حالا این کار رو خودم انجام ندادم
ولی نمیشه یه شرط بزاری که بررسی کنه با چی کانکت شده ؟ :متفکر:
اگه تاپیک کمک فوری (http://barnamenevis.org/showthread.php?410249-%DA%A9%D9%85%DA%A9-%D9%81%D9%88%D8%B1%DB%8C-onProgressUpdate) من رو دیده باشی منم یک مشکل مسخره داشتم
که بعد با ماستمالی حلش کردم :لبخند:

rubiks.kde
یک شنبه 06 مرداد 1392, 01:11 صبح
آره میشه فهمید با چی وصله ولی مشکلم اینه که خود gprs پروکسی داشته باشه باز مشکل داره
البته میشه تنظیمات apn رو خوند ولی نیاز داره برنامه از root اجرا بشه.

Modernidea
یک شنبه 06 مرداد 1392, 02:14 صبح
سلام

فکر میکنم مشکل بر میگرده به اندازه بافر. اندازه بافر را کمتر بگیرید ببنید مشکل حل میشه؟ مثلا 8

اینجا (http://stackoverflow.com/a/4438217/478162) هم توضیحی کوچکی داده شده.

موفق باشید.

rubiks.kde
یک شنبه 06 مرداد 1392, 02:37 صبح
خیلی ممنون از پاسخ ولی درست نشد

مشکلم اینه که کد بالا درسته اگه توی تنظیمات gprs پروکسی ست نشده باشه و اگه ست بشه مشکل توی تبدیل gzip به وجود میاد

darkenerboy
یک شنبه 06 مرداد 1392, 03:29 صبح
یک کار دیگه هم میشه انجام بدی با استفاده از try و catch هستش
کد اصلیت رو تو try بزار اگه خطا داد Exception رو بررسی کن اگه دلیلش همونه تو catch کد حالت دوم رو اجرا کن ! :متفکر:
بزم ماستمالی ! :لبخند:

Modernidea
دوشنبه 07 مرداد 1392, 04:51 صبح
خیلی ممنون از پاسخ ولی درست نشد

مشکلم اینه که کد بالا درسته اگه توی تنظیمات gprs پروکسی ست نشده باشه و اگه ست بشه مشکل توی تبدیل gzip به وجود میاد

لطفا خطا را اینجا قرار بدید.

موفق باشید.

rubiks.kde
دوشنبه 07 مرداد 1392, 11:52 صبح
اینم خطا
java.io.IOException: unknown format (magic number ef1f)

این رو نفهمیدم ولی به یه صورت دیگه کار کردم
اول اومدم تشخیص دادم کانکشن چیه (wifi یا gprs , ... ) بعد اگه GPRS بود تنظیمات APN رو خوندم و اگه پروکسی داشت کد رو یه جور دیگه براش نوشتم

Modernidea
دوشنبه 07 مرداد 1392, 12:42 عصر
در مورد بافر
طبق آماری که در این آدرس (http://java-performance.info/java-io-bufferedinputstream-and-java-util-zip-gzipinputstream/) داده شده، اگر اشتباه نکنم بهترین اندازه بافر 512 است.

روش خوبی را استفاده کردید ولی دانستن مشکل هم بد نیست!
طبق جستجویی که کردم، اکثرا دلیل این خطا را Encoding گفتند. چون شما میخواهید داده فشرده شده را به رشته تبدیل کنید، فکر میکنم زمانی که از طریق پراکسی داده ها انتقال داده میشه Encoding خواصی داشته باشد و این خطا پیش می آید. این آدرس (http://stackoverflow.com/a/10975030/478162) توضیحات کامل را در مورد این خطا داده است.

موفق باشید.

bazikadeh
شنبه 30 شهریور 1392, 15:34 عصر
------------------------آفرین ---------