رفتن به مطلب

درخواست معرفی تکنولوژی rmi


newScience

ارسال های توصیه شده

کسی از دوستان اگه اطلاعاتی داره لطفا در اختیار بذاره

 

سلام

اینا رو ببینین:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 4
لینک به دیدگاه

تکنولوژی RMI به منظور دسترسی به اشیا راه دور (remote object ) و همچنین انتقال اشیا در داخل یک شبکه ( serializable object) مابین سرور و کلاینت توسعه پیدا کرد .

نقطه قوت این تکنولوژی سرعت بسیار بالای انتقال اطلاعات در مقایسه با رقیبان خود از جمله وب سرویس است

اما

نقطه ضعفش در این است که برنامه هر دو طرف یعنی کلاینت و سرور باید هم زبان و جاوایی باشند

درحالی که مشکل هم زبانی در تکنولوژی های رقیب مانند وب سرویس حل شده ولی وب سرویس دارای سرعت خیلی پایینی است .

 

اما در RMI اشیا به دو صورت مورد دستیابی قرار می گیرند :

  • remote access by reference
  • remote access by value

 

در حالت اول , شیی در داخل سرور قرار دارد شی موقعی ایجاد می شود که اولین کلاینت درخواست ایجاد آن را صادر کند و هر گونه تغییری که روی شی انجام می شود توسط سایر کلاینت ها دیده می شود . حسن این روش این است که در منابع سرور صرفه جویی می شود ( شیی یکبار از هارد روی رم میاد و یکبار ایجاد می شود و در نهایت یکبار در حافظه جانبی سریالایز می شود ) ولی عیبش این است که ترافیک شبکه را بالا می برد چون مدام دستورات مختلف به سمت سرور جهت اجرا روی شیی صادر می شود .

 

درحالت دوم ، به ازای هر درخواست کلاینت شیی ایجاد می شود و در حافظه سرور جای می گیرد هر تغییری که کلاینت روی شی درخواستی خود صادر کند دیگر کلاینت ها قادر به درک و مشاهده آن نیستند . در این حالت هر شیی که ایجاد می شود اصطلاحا روی یک فایل متنی به صورت رشته خوابونده می شود و در سطح شبکه به سمت کلاینت ارسال می شود (به کار اصطلاحا serialization گفته می شود ) کلاینت تغییرات روی شیی را روی ماشین خود انجام میدهد . یعنی پردازش این بار روی خود ماشین کلانت است نه سرور . در اینجا منابع سرور هدر می رود (به علت داشتن کپی های متعدد از یک شیی ) اما نقل و انتقال اطلاعات در داخل شبکه به نسبت کمتر می شود و مسایلی مانند latecy نیز حل می شود .

 

 

اما حالتی پیش می آید که ما نیاز داریم از هر دو استراتژی استفاده کنیم یعنی بخشی از شیی به صورت value مورد دستیابی قرار گیرد و بخشی دیگر را با بقیه کلاینت ها در اشتراک بگذاریم که در این حالت تکنولوژی CORBA که یکی از تکنولوژی های برتر و رقیب سرسختی برای RMI است راه حل های خیلی عالی دارد ولی در RMI ما نیاز به طراحی یک شیی واسط دیگری داریم بنام Proxy pattern یا proxy object که در واقع نقش ماسک رو برای شیی اصلی ما بازی می کند .

 

 

..............

پ. ن : سعی می کنم مطالب بالایی رو به صورت عملی با یک مثال جاوایی که از تکنولوژی rmi بهره می برد نشون بدم

 

برمی گردم به زودی :w16:

  • Like 5
لینک به دیدگاه

البته یاد رفت بگم عیب استفاده از انتقال اشیا از طریق تکنولوژی RMI این است که کلاینت در بیشتر مواقع از پیاده سازی شیی انتقالی در شبکه خبر دارد دست کم می داند از چه property هایی تشکیل شده ( حتی اگر نداند با یک دستور java reflection ی به راحتی میتوان کل اطلاعات در مورد شیی راه دور را بدست آورد البته غیر از پیاده سازی متدهایش را )

این عیب در CORBA حل شده ولی در RMI از یک روش بنام SMART PROXY استفاده می شود که الان در حال مطالعه اون هستم به محض اینکه حالیم شد داره چیکار می کنه حتما مطالب رو به اشتراک میزارم .

  • Like 5
لینک به دیدگاه

درمورد proxy object یا surrogate object فعلا اینو بگم که چیزی نیست جز یک کلاس جاوایی که جلو شیی اصلی قرار می گیره و اونو مدیریت می کنه

مثلا اون تعیین می کنه که برای فلان درخواست فلان کلاینت فلان بخش یک گراف قابل انتقال به ماشین کلاینت باشد یا نه (دسترسی رو کنترل می کند ) یا اینکه آیا لازم است تمامی بخشهای شی اصلی روی حافظه سرور بار شود یا نه

به عبارت ساده تر کلاینت به جای اینکه طرف حسابش شی اصلی باشد اینبار با proxy object سرو کله می زند .

  • Like 4
لینک به دیدگاه

در حال حاضر برای ارتباط سرور- کلاینت تنها تکنولوژی که مورد پذیرش تمامی طرفهای دعوا:whistle: (منظورم جاواکارها و دات نتی ها ) باشد تکنولوژی بنام WEB SERVICE هستش

یعنی در این حالت شما می تونید با خیال راحت با هر زبانی که بلد هستید برنامه سروری خود رو بنویسید و اونو روی به عنوان برنامه سرویس دهنده به اشتراک بگذارید تا بقیه با هر زبان برنامه نویسی بتونن از برنامه (سرویس ) شما استفاده کنند اما عیب این روش سرعت فوق العاده پایین اون هست نمونه اش رو می تونید تو شبکه بانکی کشور یا حتی سازمانهایی مانند ثبت اسناد / احوال و... ببنید

 

اما تکنولوژی CORBA : این تکنولوژی فوق العاده سریع است (عیب وب سرویس را ندارد ) ولی متاسفانه مایکروسافت اونو قبول نکرد و یه تکنولوژی دیگه ای را واسه خودش ایجاد کرد که من اسمشو نمیدونم :ws3:

یعنی وقتی شما برنامه کاربردی خودتون رو با CORBA پیاده سازی می کنید دیگر برنامه های کاربردی که با زبانهایی مثل C# یا VB.NET نوشته شده اند نمیتوانند از خدمات برنامه شما بهره مند شوند .

اما عیب CORBA این است که خیلی پیچیده است برنامه نویسان اندکی واقعا به اون مسلط هستند (یه برنامه نویس درسطح حرفه ای لازم است ) هزینه آموزش نیروی انسانی در شرکتها خیلی بالا می رود . بنابراین کمتر شرکتی جرات رفتن به سراغ اونو می کند .

 

سوال : کی از RMI استفاده کنیم و کی از WEB SERVICE ؟

در جایی که برنامه کاربردی ما قرار است برای یک شبکه داخلی (مثل یه اداره کوچیک یا حتی بانکهای داخل کشور به شرطی که همگی به زبان جاوا نوشته شده باشند ) سرویس بده تکنولوژی RMI بهترین گزینه است اما در جایی که نمیدونیم برنامه ما قرار است به چه سازمانهایی سرویس ارایه دهد وب سرویس گزینه خوبی ست بخصوص ایران که از دم همه دات نتی هستند . :ws37:

  • Like 5
لینک به دیدگاه

مراحل ساخت یک برنامه توزیع شده با استفاده از تکنولوژی RMI :

 

  1. ابتدا باید مشخص کنیم برنامه ما از چه مولفه ها و اشیایی تشکیل شده است و نحوه ارتباط آنها با همدیگر چگونه است (طراحی معماری برنامه ) .
  2. باید مشخص کنیم چه اشیایی باید توسط ماشین های راه دور مورد دستیابی قرار می گیرند و کدام ها قرار است در ماشین محلی اجرا بشوند (نیازی نیست آنها را به اشتراک با دیگر ماشین ها بگذاریم ) .
  3. به ازای هر شی راه دور، یک واسط راه دور (remote interface ) باید تعریف کنیم که شامل متدهایی است که قرار است روی شی راه دور (remote object ) اجرا بشوند .
  4. کلاس / کلاسهایی تعریف می کنیم که آن واسط ها را پیاده سازی می کنند .

 

 

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

 

خب کار مان را شروع می کنیم ابتدا بگم قرار است چیکار کنیم .

ما در طرف سرور یک سرویسی را به اشتراک می گذاریم که عمل جمع دو عدد را انجام دهد و نتیجه را به سمت کلاینتی که آن سرویس را درخواست کرده ارسال کند . کلاینت نتیجه را گرفته و آن در کنسول خود چاپ می کند . این ساده ترین مثالی است که می توان در شروع کار ازش برای تفهیم RMI بهره برد .

قبل از شروع کد زدن نکته ای را بگم و اون اینکه چون من این مثال رو روی لپ تابم اجرا می کنم که به هیچ شبکه ای وصل نیست بنابراین باید دوبار IDE خودم رو باز و اجرا کنم به این صورت :

محیط برنامه برنامه نویسی من eclipse است .

روی آیکون eclipse کلیک می کنم تا اجرا بشود به صورت پیش فرض هرجایی که به عنوان فضای کاری خود (workspace) انتخاب کردید نشان خواهد داد مثلا درایو E .

یک پروژه جدید با نام RMI-Sample-Server (نام دلبخواهیست ) ایجاد می کنم و فوری یک پوشه (package) با نام mypackage درش ایجاد می کنم ساختار پروژه تا اینجا به شکل زیر است :

5he26y4808ffoo2j8a7.jpg

 

 

 

 

  • Like 5
لینک به دیدگاه

حال باز روی آیکون eclipse-IDE کلیک کنید این بار بجای انتخاب فضای کاری پیش فرض ، داریو دیگری را انتخاب کنید (توجه کنید eclipse به صورت همزمان اجازه باز کردن دو IDE را روی یک فضای کاری را نمیدهد ) . بازهم مراحل ایجاد پژوه جدیدی را این بار با نام RMI-Sample-Client طی کنید و درون اون بازم یک پوشه با نام mypackage ایجاد کنید . ساختارش باید مانند شکل بالایی باشد .

 

حال باید یک واسط راه دور (remote interface) در داخل هر دو پروژه ایجاد کنیم این واسط باید دقیقا شبیه هم باشد (توجه کنید وقتی میگم شبیه به هم وحی منزل نیست ولی برای شروع کار , چون هدف فهم کار RMI است بنابراین رعایت این موضوع ضروریه ) . کد داخل واسط به صورت زیر خواهد بود :

u0fqcdznd9ukblkemibm.jpg

  • Like 5
لینک به دیدگاه

همانطور که در شکل بالایی می بینید در این فایل ما رفتارهای یک شی را فقط تعریف می کنیم . و از آنجایی که قصد داریم این واسط توسط کلاینت ها مورد دستیابی قرار گیرد بنابراین آن باید از واسطی بنام Remote که دربسته java.rmi قرار دارد ارث ببرد .

 

 

حال بیایید روی پنجره مربوط به پروژه sever , اینجا باید عملکرد متدی را که در واسط IX تعریف کردیم را پیاده سازی کنیم برای اینکار یک کلاس بنام MyServer.java ایجاد می کنیم . محتوای کد آن را در شکل پایینی مشاهده می کنید :

tk74o8x0dr8pebn9jnu.jpg

اما این کلاس چه کار می کند . این کلاس دارای دو متد است یکی متدی بنام sum (همانی که در واسط IX تعریفش کردیم ) که اینجا پیاده سازیش کردیم این متد ابتدا در ماشین سرور پیغامی را چاپ می کند و بعد حاصل جمع دو عددی که کلاینت ازش خواسته را بدست آورده و آن را به سمت کلاینت ارسال می کند .و متد main که خب یک متدی اجرایی استاتیک است و در هر پروژه جاوایی نقشه شروع اجرای یک پروژه محسوب می شود ( یک main thread هستش ) . در داخل این متد یک شیی از کلاس MyServer نمونه سازی می شود . به محض ایجاد این نمونه , متد آغازگرو سازنده آن یعنی constructor (به محتویات متد MyServer() نگاه کنید ) اجرا می شود در داخل این متد ما عملیات به اشتراک گذاری سرویس خود را انجام میدهیم به این صورت که پورت شماره 1099 را برای گرفتن درخواستهایی که از طرف کلاینت می آیند را دراختیار سرویسی بنام myserver قرار میدهیم (این نام اختیاریست ) و با اینکار می گوییم ما شیی بنام ms ( همان شیی که از کلاس MyServer ساختیم ) در اختیار همه قرار میدهیم تا هرکس خواست متد sum روی آن را از طریق واسط IX فراخوانی کند . اما چرا پورت شماره 1099 ، خب این پورت پیش فرض RMI است معمولا برای هر سرویس به اشتراک گذاشته شده یک پورت بکار برده می شود . اگر سرویس دیگری سرور بخواهد به اشتراک بگذارد این بار باید پورت شماره 1100 را بکار بگیرد (یک واحد ، یک واحد ، این شماره بالا می رود ) .

  • Like 5
لینک به دیدگاه

حال بیایید سمت کلاینت و پنجره مربوط به آن را فعال کنید در این جا نیز یک کلاس ایجاد می کنیم که درخواست خود را روی شبکه به سمت سرور ارسال خواهد کرد سرویس موردنظر را جستجو کرده و نتیجه را از سرور می گیرد . کد این کلاس را در شکل زیر می بینید :

ek09ucim0kfb3en7p2.jpg

کلاینت باید ابتدا آدرس سرور را بداند که چون این جا سرور و کلاینت روی یک ماشین هستند بنابراین آدرس یک آدرس محلی (نام لپ تاب من است ) است این خط می گوید برو روی ماشین بنام sara-PC و سرویسی که نامش myserver است شیی راه دور را بدست بیار و روی آن متد sum را اجرا کن .

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

  • Like 4
لینک به دیدگاه

برای اجرا لازم است ابتدا سرور بالا بیاید روی کلاس MyServer رست کلیک کرده و دکمه اجرا را بزنید سرور بالا می آید و روی پورت 1099 آماده سرویس دهی به درخواست های آمده از سمت کلاینت هاست .

حال بیایید روی IDE مربوط به کلاینت روی کلاس Client راست کلیک کرده و دکمه اجر را بزنید

اگر توجه کنید روی کنسول کلاینت نتیجه چاپ می شود و روی کنسول مربوط به سرور پیام "Here is Server side" چاپ می شود .

 

 

در ادامه نحوه ارسال شیی در داخل شبکه از سمت سرور به کلاینت رو آموزش میدم

  • Like 4
لینک به دیدگاه

چند نکته :

  • در تکنولوژی rmi , شیی که در شبکه منتقل میشه حالا نحوه پیاده سازی متدهاش نه ولی تعریف خود شی باید برای کلاینت مشخص باشد
  • دراین تکنولوژی هرتغییری که برنامه سمت سرور روی تعریف شیی و واسط راه دور (remote interface) ایجاد کنه اگر این تغییرات را به اطلاع کلاینت نرسونه باعث ایجاد مشکل خواهد شد برای اینکار تاجایی که یادم میاد اومده بوند از ساختار xmlی برای تعریف شیی استفاده می کردند و به ازای هر تغییری که روی تعریف شیی ایجاد میشد یک شماره که نشانگر نسخه اون فایل xmlی بود روش حک میشد این جوری هر موقع کلاینت شیی رو می گرفت اول به شماره نسخه xmlی اون نگاه می کرد اگر با مال خود یکی نبود می فهمید که تعریف شیی تغییر کرده و درخواست نسخه تغییر یافته رو می کرد (این مورد رو عملی کار نکردم فقط تو مقالات به صورت تئوری خوندم ) .
  • در تکنولوژی RMI تا جایی که من سرچ کردم مفهومی بنام call by reference وجود ندارد یعنی در این حالت شیی که مشترک بین چندین کلاینت است یکبار و فقط یکبار روی ماشین سرور ایجاد می شود و فقط از طریق متدهای getter و setter اش تغییر می کند درنهایت خروجی یک متد اگر شیی باشد ابتدا سریالایز میشه و به سمت کلاینت مورد نظر ارسال میشه و وقتی این شیی به سمت کلاینت ارسال و توسط اون دریافت شد هرتغییری کلاینت روی شی دریافتی انجام بده دیگه ربط به سرور نداره و بقیه کلاینت ها از اون آگاه نمیشن . به طور خلاصه اگر شیی روی ماشین سرور قراراست بین کلاینتها مشترک باشه باید تمهیدی اندیشید (بوسیله کد ) که فقط با اولین درخواست آمده از سمت اولین کلاینت ایجاد بشه و بقیه کلاینت ها فقط با شیی ایجاد شده کار کنند.

  • Like 4
لینک به دیدگاه

در ادامه می خوام تفاوت بین شی سریالایز شده و شیی به اشتراک گذاشته شده بین کلاینت ها رو نشون بدم مثال ها خیلی ساده طراحی شدند ( دنبال الگوریتم های پیچیده با چندین خط دستور نیستم بیشتر میخوام ساختار و مفهوم رو برسونم ).

دراینجا در سمت سرور (RMI-Sample-Server) یک کلاس بنام Cat تعریف کردم همین رودر سمت دو کلاینت دیگر هم تعریف کردم ساختار پروژه سمت سروری رو در شکل زیر می تونید ببنید(کلاس Account رو فعلا نادیده بگیرید مربوط به این کار نیست) :

8zivuv9wexz0yt9pt1x.jpg

همچنین ساختار پروژه سمت کلاینتی رو هم در شکل زیر می تونید ببنید :

q8jx5opaz84sv6xbyvpn.jpg

همچنین محتوای داخل فایل IX (واسط راه دور ما به صورت زیر است ) :

5o9zhdxr37cokyxbqdvf.jpg

 

  • Like 3
لینک به دیدگاه

همان طور که می بینید ما برای اینکه شیی از کلاس Cat توسط درخواستی که از سمت کلاینت صادر خواهد شد ایجاد کنیم یک متد در این واسط تعریف کردیم توجه کنید این متد هم باید در فایل ix سمت سرور و هم در داخل فایل ix سمت کلاینت ها تعریف شده باشد(به تعریف متد createCate() توجه کنید ) .

سناریوی ما به این صورت است که با اولین درخواست آمده از سمت اولین کلاینت یک شی از کلاس Cat ایجاد کرده و آن را در اختیار همه کلاینت ها قرار دهد . تا آنها با استفاده از فراخوانی متدهای مرتبط , شیی به اشتراک گذاشته شده رو دستکاری کنند(دستکاری شیی ایجاد شده توسط متد changeNamrOfCat() صورت می گیرد که نام شی گربه را به نامی دلخواه تغییر می دهد) .

حالا ما باید این سه متد رو مانند متد sum در داخل کلاس MyServer پیاده سازی کنیم .

محتویات داخل کلاس MyServer به صورت زیر است :

0b0gz00ovhc5wdgeycpj.jpg

خب گفتیم که با اولین درخواست اولین کلاینت ، یک شی از کلاس Cat ایجاد خواهد شد برای اینکار ما یک متغیر استاتیکی در کلاس MyServer خود تعریف می کنیم که وقتی کلاینتی متد createCat رو فراخوانی کرد در داخل این متد اول مقدار این متغیر استاتیک رو بررسی کند اگر برابر صفر بود به این معنی است که هنوز شیی ایجاد نشده و شیی ایجاد می شوددر غیر این صورت شیی ایجاد نمی شود (چون قبلا توسط کلاینت دیگری ایجاد شده است ) .

بچه هایی که نرم افزار و درس OS پاس کردند با مبحث ناحیه بحرانی و سمافور ها و مانیتورها آشنا هستند در اینجا متغیر isCreated یک ناحیه بحرانی است یعنی ابتدا مقدار این متغیر باید چک شده و براساس مقدار اولیه اش , مقدار فعلیش به روز گردد . چون ممکن است همزمان دو کلاینت بخواهند به این متغیر دسترسی داشته باشند بنابراین ما کل متد createCat رو به اصطلاح همگام سازی می کنیم (با استفاده از کلمه کلیدی synchronized ) تا اولین کلاینتی که این متد رو فراخوانی کرد بقیه کلاینت ها درصف منتظر باشند تا کار کلاینت فعلی در داخل این متد تمام شده و بیرون بیاد تا نوبت به کلاینت بعدی برسد

توجه : این روش ، خطر در بن بست گیر کردن کلیه برنامه ها (کلاینت ها ) رو در پی داره اگه راه حل بهتری پیشنهاد بدید ممنون میشم .

به عنوان مثال ممکن است اولین کلاینت در داخل متد گیرکرده به هر دلیلی نتواند از ان بیرون بیاید درآن صورت هیچ کدام از کلایینت های بعدی که در صف منتظر هستند نخواهند توانست وارد متد شده و شیی را ایجاد کنند .

باید دستوری بنویسیم که بتونه این کلاینت سکته زده داخل متد رو بکشه بیرون و دسترسی به این متد رو برای بقیه فراهم کنه ( شبیه سازی روند گلاب به روتون ، دستشویی عمومی مد نظرتون باشه دی : )

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

کد داخل کلاس Client شماره یک :

7eb1ulyhfibs8j4wxn.jpg

 

 

در داخل متد main این کلاس ، کلاینت ابتدا خود شی (کلاسی که به عنوان سرویس به اشترااک) گذاشته شده مورد دسترسی قرار گرفته و بعد cast میشه به شیی از نوع واسط IX بعد درخواست ایجاد شی cat از طریق فراخوانی متد createCat() به سمت سرور ارسال می شود اگر نتیجه برابر یک باشد یعنی این کلاینت اولین کلاینتی بود که درخواست ایجاد شی را به سمت سرور فرستاده , درنتیجه شیی ایجاد شده و آماده استفاده توسط همه است ولی اگر قبلا کلاینتی زودتر این شی را ایجاد کرده باشد مقدار برگشتی این متد برابر دو خواهد بود . در مرحله بعد (چه شی cat توسط این کلاینت ایجاد شده باشد چه نشده باشد ) او درخواست تغییر نام cat می کند .

توجه کنید در اینجا برگشتی متد changeNameOfCat() نام تغییر یافته شیی catاست که ممکن است همان نامی باشد که این کلاینت ارسال کرده و ممکن است نامی باشد که آخرین کلاینت به سمت سرور ارسال کرده باشد . برای اینکه تغییرات را بهتر متوجه شویم با استفاده از thread.sleep() یک وقفه به اندازه 8 ثانیه در اجرای متد main() ایجاد می کنیم بعد نام تغییر یافته شیی به اشتراک گذاشته رو چاپ می کنیم .

  • Like 3
لینک به دیدگاه

قبل از اجرای برنامه و مشاهده خروجی برنامه به محتویات کلاینت دومی نگاه می کنیم که تقریبا عین این است !

s6el81xhdi66epfp3l.jpg

این کلاینت دوست داره اسم گربه رو Puma بزاره !

حال نحوه اجرا ، من یه نمودار توالی برای اجرای ترتیبی این سه ماشین (سه پروژه ) کشیدم :

 

r0vjwi4qym9zg6qb9ue3.jpg

ابتدا سرور باید اجرا بشه (عین روز روشنه )

بعد اون کلاینتی که دارای دستور thread.sleep() هستش رو اجرا کنید و خیلی زود (کمتر از 8 ثانیه ) کلاینت دومی رو اجرا کنید این جوری نحوه کار برنامه رو بهتر متوجه میشید( شما باید اینجا سه تا IDE باز کرده باشید ) .

خروجی به ترتیب به صورت زیر خواهد بود:

خروجی کلاینت شماره یک :

 

b18z8oqjzp5r4vc2uxr.jpg

و خروجی کلاینت دومی :

 

a147t6cs2b0dt64kdft.jpg

در واقع وقتی کلاینت شماره یک اولین درخواست رو ارسال می کنه شی cat ایجاد میشه (روی ماشین سرور) بعد که کلاینت دومی درخواست ایجاد رو ارسال می کنه چون قبلا ایجاد شده دیگه ایجاد نمیشه .

اما کلاینت اولی , اسم گربه رو به PiPi تغییر میده اما بعد که کلاینت دومی نام گربه رو به Puma تغییر میده این تغییر رو کلاینت اولی هم متوجه میشه (بعد از 8 ثانیه دوباره نام گربه رو میخواد بجای PiPi نام Puma چاپ میشه ) .

 

 

 

  • Like 3
لینک به دیدگاه
  • 9 ماه بعد...

اول تشکر کنم بات توضیحات عالی، من بلاخره فهمیدم قضیه rmi چیه! فقط نیازی که من دارم اینه که میخوام اگه سمت سرور exception رخ داد (custom exception که خودم نوشتم)، سمت کلاینت اون رو هندل کنم! میشه با rmi این کارو انجام داد؟ اگه آره میشه بگید چطور این کار رو باید انجام داد؟

لینک به دیدگاه
×
×
  • اضافه کردن...