Home برمجة جافا منع تشغيل أكثر من نسخه من برنامجك
منع تشغيل أكثر من نسخه من برنامجك

منع تشغيل أكثر من نسخه من برنامجك

86
3

في بعض الأحيان قد نجبر المستخدم على عدم فتح أكثر من نسخه من البرنامج ، وخاصه في البرامج التي تتصل مع قاعده البيانات والتي لا تقوم بعمل Commit الا مثلا عند الخروج من البرنامج أو أي برنامج أخر مثلا مثل برامج المنبهات والتي تعمل كل مده معينه .. أو لأي سبب أخر يريده المبرمج.

ولأن أي برنامج نقوم بتشغليه فسوف يعمل على VM خاصه به ، لذلك لا توجد طريقه مباشره لهذا الأمر وسوف نستعرض اشهر طريقتين ، أحدهما عن طريق socket  ، والأخرى عن طريق FileLocking .

الطريقه الأولى The socket technique :
هذه الطريقه فكرتها كالأتي: هو عندما نشغل البرنامج لأول مره نقوم بتشغيل Server برقم بورت معين مثلا 2000 ، ويكون هذا السيرفر دليل على أن هناك نسخه تعمل . في حال شغلت نسخه أخرى من البرنامج نقوم بالاتصال بالسيرفر فاذا أتصل فهذا معناه أن هناك نسخه تعمل وهنا سوف أغلق البرنامج الجديد .أي الخوارزميه كالأتي/
– قم بالأتصال بالسيرفر بالمنفذ 2000 ، في حال أتصل فمعناه أنه هناك نسخه تعمل ، فقم الأن باغلاق النسخه الجديده .
– في حال لم يتصل البرنامج بالسيرفر (معناه أنه لا يوجد سيرفر يعمل ) سوف ينفذ جزء Exception وهنا سوف نقوم بتشغيل السيرفر من داخل الException .كود بسيط للسيرفر :

وهذا كود البرنامج :

نأخذ مثال لتطبيق الفكره ، وهو لبرنامج مفكره بسيط يقوم بحفظ وقرائه ملفات txt وبه خاصيه نسخ ولصق … المهم أنظر الصوره التاليه وستجد أننا نستطيع تشغيل أكثر من نسخه .. نريد الأن اضافه الطريقه التي تعلمناه قبل قليل عليه

 uqucs_HflN9G88W

ننظر الى الداله الرئيسيه :

نقوم الأن باضافه كود الأتصال في البدايه -أول سطر في البرنامج- :


وها هو برنامجنا الأن يصيح عندما تقوم بتشغيل أكثر من نسخه :
uqucs_D1HvrMYdQ

على العموم ، الطريقه ليست سريعه كما في الطريقه التاليه ، ولكنها تفي بالغرض !!

الطريقه الثانيه The file lock technique :

تعتمد هذه الطريقه على java.nio.channels وطريقتها هي انشاء ملف في مجلد user.home وعمل lock عليه channel.tryLock() ، وفي حاله لم يستطع البرنامج عمل lock وذلك بسبب وجود نسخه تعمل سوف يحصل Exception من نوع OverlappingFileLockException . وعند اغلاق البرنامج يجب أن نزيح هذا المقبض على الملف وذلك باستخدام shutdown hook . هذا الكود ، قم بتشغيله وستجد أنه أسرع من الطريقه الأولى ..

الملف الأول JustOneLock وهو الخاص بوضع الLock . ونستطيع استخدامه مع أي برنامج أخر بلا تغيير .

برنامجنا الذي نريده أن يعمل مره واحده :

نقوم بالتعديل الأن في برنامج المفكره لكي نستخدم هذ الطريقه ، وسوف تكون الداله الرئيسيه بهذا الشكل :

هذا الرابط يحتوى على البرنامج بطريقة File Locking

(86)

وجدي عصام مهندس برمجيات مهتم بعلوم الحاسب وبالأخص مجال الخوارزميات وهندسة البرمجيات وحماية التطبيقات،

Comment(3)

  1. أعجبنى جدا موضوع ال ShutdownHooks

    لكن لي سؤال … في POSIX systems فإن نظام التشغيل يسمح لأي شخص بالتعديل (حتى المسح) للملفات و إن كانت مستخدمه بعمليات أخري.

    فما الوضع إذن إن قمنا بتشغيل البرنامج و من ثم حذفنا ملف ال Lock و من ثم أردنا تشغيل نسخه اخرى من البرنامج؟ هل ستعمل النسخه الأخري؟

  2. موضوع جميل كالعادة، لكن أظن أن هذه الطرق قد لا تنجح بعض الأحيان وخصوصا طريقة ال Socket لأنك لا تعلم هل البورت الذي اخترته مستعمل أم لا في جهاز المستخدم كما أن طريقة ال FileLock لا تعمل في بعض أنظمة التشغيل مثل Solaris.
    في رأيي يمكن برمجة Luncher يقوم بتشغيل البرنامج ويحتفظ بعدد ال instances المشغلة أو يمكن البحث في ال TaskList عن اسم البرنامج فأذا كان موجود تظهر الرسالة و اذا لم يكن موجود يتم تشغيله.

LEAVE YOUR COMMENT

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مشاركة