نمایش نتایج 1 تا 7 از 7

نام تاپیک: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

  1. #1
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    مشکل عجیب غریبی که هنگام استفاده از
    input=new ObjectInputStream(socket.getInputStream());

    که نه اشتباهی در کد هست و نه در کامپایل!
    ولی همینجا برنامه متوقف میشه.

    من اول این کد رو برای سرور نوشتم :
    try {
    input=new ObjectInputStream(s.getInputStream());
    System.out.println("Client : OBJ IN Created!");
    output=new ObjectOutputStream(s.getOutputStream());
    System.out.println("Client : OBJ OUT Created!");
    } catch (IOException ex) {
    Logger.getLogger(ClientWin.class.getName()).log(Le vel.SEVERE, null, ex);
    }

    و شبیه به همین برای کلاینت. اما هنگ میکرد.
    بعد اومدم جای output رو با input عوض کردم، درست شد و برنامه اجرا میشد و هنگ نکرد :
    try {
    output=new ObjectOutputStream(s.getOutputStream());
    System.out.println("Client : OBJ OUT Created!");
    input=new ObjectInputStream(s.getInputStream());
    System.out.println("Client : OBJ IN Created!");
    } catch (IOException ex) {
    Logger.getLogger(ClientWin.class.getName()).log(Le vel.SEVERE, null, ex);
    }

    البته توضیحی بدم که برای سرور اگه جابه جا نکنی، برنامه هنگ میکنه. ولی برای کلاینت فرقی نمیکنه، هر کدوم رو بنویسی جواب میده!

    به هر حال نمیدونم مشکل از چیه، ولی راه حلی موقتی خوبی بود. تو stackoverflow.com هم با چنین مشکلی روبرو شده بودن ولی متوجه توضیحاتشون نشدم.
    حالا این راه حل عجیب غریبش، ولی من میخوام دلیلش رو بدونم چرا این اتفاق افتاده؟

  2. #2
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    دو تا مطلب پیدا کردم از قسمت باگ های سان میکروسیستم. یه نگاه بندازین ببینید واقعا باگ هست یا فکر کردن باگه و مطرح کردن؟

    http://bugs.sun.com/bugdatabase/view...bug_id=4158122

    http://bugs.sun.com/bugdatabase/view...bug_id=4162466

    از طرفی چون باگ مطرح شده مربوط به 7 یا 8 سال پیشه، احتمال میدم نباید باگ باشه وگرنه تا الان درست شده بود. احتمالا یه اصل و اساسی داره!

  3. #3
    کاربر دائمی آواتار cups_of_java
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    تهران
    سن
    40
    پست
    1,544

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    ابن باگ نیست به خاطر این هست که
    new ObjectInputStream(
    به صورت بلاکینگ کار میکنه! در واقع انقدر صبر می کنه تا ورودی به ObjectInputStream برسه و اون بخونتش! بنابراین همون جا منتظر ورودی می مونه و چیزی هم نمیگیره.
    بهتره یا از BufferedInputStream استفاده کنی به جای ObjectInputStream یا اینکه سرور و کلاینت طوری با هم تنظیم کار کنن که هیچ کدوم بلاک نشن! (که این واقعن سخته)
    ببین این کمکت می کنه:

     ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));  
    System.out.println("ready");

    String temp = (String) in.readObject();

  4. #4
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    خب اینکه ObjectOutputStream قبلش بیاریم این مشکلات رو حل نمیکنه؟ یا اینکه بافر اینجا چیکار میکنه. در هر صورت که هیچ ورودی نداریم که بافر بشه و به ObjectInputStream بده.
    در کل نقش بافر رو در گرفتن اطلاعاتی که اصلا وجود نداره رو نگرفتم. وگرنه پیشنهاد خوبیه، اتفاقا فکر میکنم بهتره همیشه از بافر استفاده بشه. حتی برای خروجی. گرچه برای خروجی همیشه متد flush() لازمه تا اطلاعات به موقع ارسال بشه.

    در کل میخوام ببینم این بافر اینجا چه تفاوتی ایجاد کرده نسبت به حالت قبل.

    ممنون

  5. #5
    کاربر دائمی آواتار cups_of_java
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    تهران
    سن
    40
    پست
    1,544

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    اول تستش کردی ببینی اصن کار می کنه یا نه!؟
    ObjectStream ها برای Serialization اشیا بکار میرن و توی specificationشون هست که توی کانستراکتور تلاش در خوندن ورودی می کنن وگرنه بلاک میشن. ترکیبشون با socketها دقیقن همین موضوع رو پیش میاره.
    برای حل این موضوع یا باید بینوشون یه چیزی مثل یه بافر قرار بدی تا پکت های ورودی رو به صورت بافر و با تنظیمات عوض شده برسونی به ObjectStreamت تا بلاک نشه (همین مثال بالا که خودم تستش نکردم و مطمین نیستم درست کار کنه یا نه)‌ یا اینکه از nio استفاده کنی.
    شاید اصن مناسبتر هم باشه که از Object Serialization‌استفاده نکنی! این API دستت رو بسته با این کارش دردسر برات درست ایجاد میکنه. به جای ObjectStreamها خودت ورودی خروجی رو کنترل کن.

  6. #6
    کاربر دائمی آواتار cups_of_java
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    تهران
    سن
    40
    پست
    1,544

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    اول تستش کردی ببینی اصن کار می کنه یا نه!؟
    ObjectStream ها برای Serialization اشیا بکار میرن و توی specificationشون هست که توی کانستراکتور تلاش در خوندن ورودی می کنن وگرنه بلاک میشن. ترکیبشون با socketها دقیقن همین موضوع رو پیش میاره.
    برای حل این موضوع یا باید بینوشون یه چیزی مثل یه بافر قرار بدی تا پکت های ورودی رو به صورت بافر و با تنظیمات عوض شده برسونی به ObjectStreamت تا بلاک نشه (همین مثال بالا که خودم تستش نکردم و مطمین نیستم درست کار کنه یا نه)‌ یا اینکه از nio استفاده کنی.
    شاید اصن مناسبتر هم باشه که از Object Serialization‌استفاده نکنی! این API دستت رو بسته با این کارش دردسر برات درست ایجاد میکنه. به جای ObjectStreamها خودت ورودی خروجی رو کنترل کن.

  7. #7
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: هنگ کردن برنامه هنگام استفاده از ObjectInputStream(socket.getInputStream())

    نه متاسفانه اینم جواب نمیده. فکر میکنم بافر کردن نقشی نداشته باشه، چون به هر حال یه ورودی باید باشه که بیاد جمع کنه. ( البته امیدوارم معنی بافر کردن رو دقیق فهمیده باشم )

    ولی چندین بار که امتحان کردم و اینکه ObjectOutputStream رو قبل از ObjectInputStream قرار دادم، برنامه بدون مشکل کار کرده. فقط میترسم چون الان رو یه سیستم واحد هست مشکلی نداره، ولی اگه رو دو سیستم قرار بگیره چی میشه؟ اگه مشکلی نداشته باشه که خوبه.
    چون فکر میکنم اگه output اول ساخته بشه، یه چیزی میفرسته، بعد اگر اینپوت بعدی درست بشه، در هر حال یه چیزی میگیره و از بلاک در میاد. چطوره به نظرت؟

    دلیل استفادم از ObjectOutputStream اینه که درگیر بایت و نمیدونم چیزهای مختلف نشم. چون InputStream در حالت عادی به صورت بایت میگیره، دردسر ساز میشه در مواردی. چون یه آرایه با طول ثابت رو هر دفعه ایجاد میکنه و در اصل داره اطلاعاتت رو ناقص رد و بدل میکنه.

تاپیک های مشابه

  1. حرفه ای: مشکل هنگ کردن در هنگام استفاده از Ajax
    نوشته شده توسط abpsoft در بخش طراحی وب (Web Design)
    پاسخ: 13
    آخرین پست: چهارشنبه 29 خرداد 1392, 16:16 عصر
  2. سوال: هنگ کردن برنامه هنگام زیپ کردن فایل
    نوشته شده توسط SHD.NET در بخش VB.NET
    پاسخ: 3
    آخرین پست: پنج شنبه 30 آذر 1391, 20:31 عصر
  3. گفتگو: هنگ کردن برنامه هنگام استفاده از کد زیر
    نوشته شده توسط shytonak در بخش C#‎‎
    پاسخ: 2
    آخرین پست: پنج شنبه 20 مرداد 1390, 11:27 صبح
  4. سوال: هنگ کردن برنامه هنگام پاک کردن ایتم های تکراری در لیست باکس
    نوشته شده توسط alishademan در بخش برنامه نویسی در 6 VB
    پاسخ: 0
    آخرین پست: دوشنبه 16 خرداد 1390, 14:28 عصر
  5. جلوگیری از هنگ کردن برنامه با استفاده از ترد ها
    نوشته شده توسط IMANAZADI در بخش C#‎‎
    پاسخ: 11
    آخرین پست: یک شنبه 24 بهمن 1389, 19:52 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •