جامعه برنامه نویس

برگشت   جامعه برنامه نویس > فناوری جاوا > برنامه‌نویسی جاوا

اطلاعیه

برنامه‌نویسی جاوا در این بخش می‌توانید درباره مطالب مربوط به برنامه‌نویسی جاوا بحث و گفتگو کنید.


پاسخ
 
ابزار های تاپیک طریقه نمایش
قدیمی یک شنبه 07 مهر 1387, 00:56 صبح   #1
manvaputra
مدیر بخش
 
آواتار manvaputra
 
تاریخ عضویت: شهریور 1386
پست: 1,042
تشکرها: 268
505 بار تشکر شده در 315 پست
Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

پیش نیاز:

ارتباط TCP در جاوا

Thread در جاوا (قسمت اول:مفاهیم اولیه Thread)

Thread در جاوا (قسمت دوم:ایجاد ترد با استفاده از روش بسط کلاس Thread)

Thread در جاوا (قسمت سوم:ایجاد ترد با استفاده از واسط Runnable)


پیاده سازی چت با استفاده از مالتی ترد:

در آموزش برقراری ارتباط از نوع TCP نمونه یک چت ساده پیاده سازی شد. در این برنامه موارد زیر وجود داشت که برای رفع آنها می بایست از تکنولوژی ترد استفاده شود:
  • کلاینت شروع کننده و خاتمه دهنده چت بود بدین معنا که سرور نمی توانست قبل از اینکه پیامی از کلاینت دریافت کند اقدام به ارسال پیام نمیاد.
  • مکالمه بصورت یک در میان بود یعنی کلاینت مطلبی را ارسال می کرد و خود در حالت شنود قرار می گرفت در طرف دیگر سرور که در حالت شنود بود پیام را دریافت نموده و به حالت ارسال تغییر وضعیت می داد.
  • مکالمه با ارسال QUIT از طرف کلاینت خاتمه پیدا می کرد یعنی سرور قادر به خاتمه ارتباط نبود.
دلیل تمامی موارد بالا در این نکته نهفته است که برنامه ما در یک زمان عمل ارسال و دریافت را نمی توانست انجام دهد.

همانطور که قبلا اشاره شد برای ایجاد همزمانی در برنامه می بایست از ترد استفاده کرد در برنامه چت مورد نظر دو بخش اساسی وجود دارد:

  • بخشی که مسئول دریافت اطلاعات از کاربر و ارسال آنها می باشد.
کد:
sendstring=inp.next();  
output.writeUTF (sendstring);
  • بخشی که مسئول دریافت اطلاعات از سمت ارسال کننده و نمایش آنها می باشد.
کد:
request = input.readUTF ();
System.out.println(request);

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

ارسال اطلاعات:


کد:
class send extends Thread
{
private DataOutputStream output;

public send(DataOutputStream s) throws Exception{
       output=s;
  }    
public void run()
{ 
String sendstring="";    
do{
 Scanner inp = new Scanner(System.in);
  try{
  sendstring=inp.next();  
  output.writeUTF (sendstring);     
    }catch(IOException e){}
      }while(true);
}
}
دریافت اطلاعات:

کد:
    class recv extends Thread
  {
  private DataInputStream input;
  private DataOutputStream output;
  
  public recv(DataInputStream s,DataOutputStream t) throws Exception{
            input=s;
            output=t;
      }    
  public void run()
  { 
  String request="";   
   do{
     try{
      request=input.readUTF();
    if (request.equals("Q")){
             output.writeUTF("Q");
             System.exit(0);}
       System.out.println("CLIENT:"+request);     
       }catch(IOException e){}
      }while(true);
  
  }
  }
ما بقی آنچه در برنامه مشاده می کنید مانند همان مثال اولیه می باشد. فقط کافیست بعد از انجام مراحل اولیه که همان ایجاد سوکت - ایجاد ارتباط – و معرفی Stream های ورودی و خروجی دو ترد از انواع ایجاد شده در بالا تعریف نمود:
کد:
send Tsend =new send(output); 
recv Trecv=new recv(input,output);
Stream های ورودی و خروجی ایجاد شده به عنوان پارامتر به این دو ترد ارسال می شود. حال کافیست دو ترد مورد نظر را اجرا کنیم:


کد:
Tsend.start();
Trecv.start();
برای خاتمه برنامه از متد System.exit(0) استفاده شده است یعنی چه کلاینت و چه سرور با دریافت کارکتر Q کل سیستم را متوقف می کنند. این روش به غیر از ساده سازی آموزش بالا استفاده دیگری برای ما ندارد چون طبیعیست قرار نیست کا برنامه ما با بسته شدن ارتباط دو نفر به طور کامل متوقف شود!!! چاره چیست ؟؟ استفاده از حلقه While و گذاشتن شرط تا این مرحله جوابگو نمی باشد چرا که به فرض دریافت Q در قسمت مربوط به دریافت اطلاعات فقط این بخش را می توانیم متوقف کنیم(اگر شرطWhile باشد) و بخش مربوط به ارسال همچنان فعال باقی می ماند چون اصولا دریافت و ارسال دو ترد جداگانه هستند چاره کار در این است که بعد از دریافت Q علاوه بر غیر فعال کردن ترد دریافت ترد ارسال نیز از درون ترد دریافت غیر فعال شود .
مشکل دسترسی به ترد ارسال از درون ترد دریافت با فرستادن ترد ارسال به عنوان پارامتر به ترد دریافت حل می شود. تنها سوالی که در اینجا مطرح است چگونگی توقف یک ترد می باشد که در قسمت بعدی که بررسی متد های مربوط به ترد ها می باشد به توضیح آن می پردازیم.

کد سرور و کلاینت مربوط به این آموزش ضمیمه می باشد.


فایل های ضمیمه
نوع فایل: zip code.zip‏ (1.3 کیلوبایت, 181 دیدار)
__________________
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.
-- Elbert Hubbard (1856-1915)"

ذکات علم نشر آن است

آخرین ویرایش به وسیله manvaputra : یک شنبه 07 مهر 1387 در 04:25 صبح
manvaputra آفلاین است   پاسخ با نقل قول
10 کاربر از manvaputra به خاطر این مطلب مفید تشکر کرده اند:
قدیمی چهارشنبه 08 آبان 1387, 10:37 صبح   #2
سارامجیدی
کاربر جدید
 
تاریخ عضویت: مهر 1387
پست: 26
تشکرها: 1
یک بار تشکر شده در یک پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

سلام
خیلی ممنون از آموزش کامل و کدهایی که در مورد برنامه چت سرور گذاشتین
از بگم من خیلی تازه کارم و اگه سوالاتم خیلی پیش پا افتاده است ببخشید
من همشونو داونلود کردم
اما نمیدونم چطور خروجی رو ببینم
کامپایلش خیلی زمان میبره
من از NetBeans استفاده میکنم و نمیدونم برای اجرا باید چه مراحلی رو دنبال کنم
لطفا منو راهنمایی کنین
سارامجیدی آفلاین است   پاسخ با نقل قول
کاربرانی که به خاطر مطلب مفید سارامجیدی از وی تشکر کرده‌اند:
قدیمی چهارشنبه 08 آبان 1387, 12:59 عصر   #3
manvaputra
مدیر بخش
 
آواتار manvaputra
 
تاریخ عضویت: شهریور 1386
پست: 1,042
تشکرها: 268
505 بار تشکر شده در 315 پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

با سلام شما کافیه توی نت بینز دو تا فایل جدید باز کنید و مدها رو کپی کنید اونجا بعد اول فایل مربوط به سرور رو اجرا کنید البته به این صورت که روی نام فایل کلیک راست کنید بعد گزینه run رو انتخاب کنید و بعد به همین روش کلاینت رو هم اجرا کنید توی بخش output که پایین صفحه نت بینز میاد میشه خروجی رو دید.
اگه احساس می کنید توضیحات نتونسته کمک کنه بگید تا کلا برقراری چت ساده با نت بینزو بذارم تو سایت.
__________________
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.
-- Elbert Hubbard (1856-1915)"

ذکات علم نشر آن است
manvaputra آفلاین است   پاسخ با نقل قول
کاربرانی که به خاطر مطلب مفید manvaputra از وی تشکر کرده‌اند:
قدیمی چهارشنبه 08 آبان 1387, 15:07 عصر   #4
سارامجیدی
کاربر جدید
 
تاریخ عضویت: مهر 1387
پست: 26
تشکرها: 1
یک بار تشکر شده در یک پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

خیلی ممنون از راهنماییتون
من این کار رو انجام دادم اما ازم ارور میگیره
این کل اون چیزیه در خروجی نشون میده
java.lang.NoClassDefFoundError: threadclient
Caused by: java.lang.ClassNotFoundException: threadclient
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 06)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 51)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
Exception in thread "main"
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
سارامجیدی آفلاین است   پاسخ با نقل قول
قدیمی چهارشنبه 08 آبان 1387, 16:49 عصر   #5
manvaputra
مدیر بخش
 
آواتار manvaputra
 
تاریخ عضویت: شهریور 1386
پست: 1,042
تشکرها: 268
505 بار تشکر شده در 315 پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

میشه بگید دقیقا چه مراحلی رو طی می کنید؟
__________________
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.
-- Elbert Hubbard (1856-1915)"

ذکات علم نشر آن است
manvaputra آفلاین است   پاسخ با نقل قول
قدیمی چهارشنبه 08 آبان 1387, 17:05 عصر   #6
mohsensaghafi
کاربر دائمی
 
آواتار mohsensaghafi
 
تاریخ عضویت: اردیبهشت 1386
محل زندگی: و نپرسیم کجاییم. بو کنیم اطلسی تازه بیمارستان را
پست: 257
تشکرها: 34
103 بار تشکر شده در 74 پست
ارسال پیام از طریق Yahoo به mohsensaghafi
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

سلام دوست من.
با تشکر از manvaputra باید بگم که این برنامه رو شخصا تست کردم و کاملا درست کامپایل می شه. احتمالی که من می دم، اینه که شما فایل های جدیدی رو که درست می کنید با نام کلاسهای برنامه یکسان نیست. شما باید فایل هایی با نام های Threadclientبرای کلاینک و Threadserver برای سرور درست کنید بعد متن این کلاسها را از فایل های Atach شده کپی کنید. در netBeans هم گرینه ی new JavaClass رو برای ایجاد فایل ها انتخاب کنید.
یا حق!
mohsensaghafi آفلاین است   پاسخ با نقل قول
کاربرانی که به خاطر مطلب مفید mohsensaghafi از وی تشکر کرده‌اند:
قدیمی یک شنبه 12 آبان 1387, 08:55 صبح   #7
سارامجیدی
کاربر جدید
 
تاریخ عضویت: مهر 1387
پست: 26
تشکرها: 1
یک بار تشکر شده در یک پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

با تشکر از دوستان
مراحلی که من دنبال میکنم
اول در Netbeans یه پروژه جدید ایجاد میکنم
در اون پروژه یه New file... ایجاد میکنم و اسم اون رو Treadserver میذارم
کل محتویاتش رو پاک میکنم و محتویات فایل Threadserver که Attach شده رو داخلش کپی میکنم
روی اسم کلاس راست کلیک میکنم و Run File رو میزنم
که بهم خروجی زیر رو میده:
java.lang.NoClassDefFoundError: chat/Threadserver
Caused by: java.lang.ClassNotFoundException: chat.Threadserver
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 06)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 51)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
Exception in thread "main"
Java Result: 1
سارامجیدی آفلاین است   پاسخ با نقل قول
قدیمی یک شنبه 12 آبان 1387, 14:54 عصر   #8
manvaputra
مدیر بخش
 
آواتار manvaputra
 
تاریخ عضویت: شهریور 1386
پست: 1,042
تشکرها: 268
505 بار تشکر شده در 315 پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

با سلام مجدد طبق روالی که رفتید مشکلی نداره من برای اطمینان مجددا چک کردم الان ولی یه نکته توی برنامه شما داره از chat/Threadserver ایراد می گیره! به نظر این chat/ اضافه میاد ببینید کجا اشتباهن نوشتید مطمئن باشید تا حل کامل مشکل با شما هستیم
__________________
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.
-- Elbert Hubbard (1856-1915)"

ذکات علم نشر آن است
manvaputra آفلاین است   پاسخ با نقل قول
قدیمی دوشنبه 13 آبان 1387, 02:02 صبح   #9
mohsensaghafi
کاربر دائمی
 
آواتار mohsensaghafi
 
تاریخ عضویت: اردیبهشت 1386
محل زندگی: و نپرسیم کجاییم. بو کنیم اطلسی تازه بیمارستان را
پست: 257
تشکرها: 34
103 بار تشکر شده در 74 پست
ارسال پیام از طریق Yahoo به mohsensaghafi
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

سلام دوست من.
اول یه پروژه جدید باز کن و اسمی رو برای وارد کن.





* - پروژه شما ساحته می شود. جال باید فایل ها رو بسازید. بر روی قسمت مشحص شده راست کلیک کنید و new سپس Java Class رو انتخاب کنید.


احتمالا مشکل قبلی شما در ایجاد نکردن این فایل بوده است ( بر اساس آخرین مطلب ارسالی شما)


حال کد برنامه را کپی کنید و در فایل ایجاد شده past کنید.




جال برنامه را اجرا کنید.


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




باز هم اگر مشکلی در اجرای برنامه پیش آمده اعلام کنید.
موفق و پیروز
یا حق!
mohsensaghafi آفلاین است   پاسخ با نقل قول
2 کاربر از mohsensaghafi به خاطر این مطلب مفید تشکر کرده اند:
قدیمی دوشنبه 13 آبان 1387, 07:24 صبح   #10
سارامجیدی
کاربر جدید
 
تاریخ عضویت: مهر 1387
پست: 26
تشکرها: 1
یک بار تشکر شده در یک پست
نقل قول: Thread در جاوا (قسمت چهارم:پیاده سازی مثال چت با استفاده از مالتی ترد)

سلام
خیلی خیلی ممنون بابت زحمتی که کشیدین
منم مراحل رو همونطور دنبال کردم اما نتیجه همون قبلی شد
java.lang.NoClassDefFoundError: thchat/Threadserver
Caused by: java.lang.ClassNotFoundException: thchat.Threadserver
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 06)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 51)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
Exception in thread "main"
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)
دقیقا همون مشکل قبلی...

سارامجیدی آفلاین است   پاسخ با نقل قول
پاسخ

بوک مارک کردن این تاپیک


کاربرانی که این تاپیک را مشاهده میکنند: 1 (0 کاربران و 1 مهمان)
 
ابزار های تاپیک
طریقه نمایش

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

BB code روشن است
خندانک ها روشن هستند
[IMG] روشن است
HTML خاموش است

پرش



واحد زمان برحسب ساعت لندن +3.5. ساعت هم اکنون 05:54 صبح است.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 1389, Jelsoft Enterprises Ltd.
خدمات میزبانی این سایت تحت پوشش شرکت ایران هاست می باشد.