PDA

View Full Version : مقاله: ارتباط UDP در جاوا (کلاینت-سرور)



manvaputra
شنبه 23 شهریور 1387, 14:25 عصر
ارتباط UDP در جاوا:

Socket Programming in Java Using UDP.


خوب دوستان عزیز دوباره سلام امیدوارم که از تاپیک آموزش TCP (http://barnamenevis.org/forum/showthread.php?t=119875)استفاده کرده باشید همونطور که قولشو داده بودم اینبار می خوام نحوه برقراری ارتباط از نوع UDP رو شرح بدم امیدوارم دوستان و اساتید اینبار هم از راهنمایی و کمک های خودشون ما رو بی نصیب نذارن.

همونطور که می دونید پروتکل UDP بر خلاف اون چیزی که توی TCP دیدیم پروتکلی اتصال گرا نیست بدین معنی که نیازی به برقراری اتصال دایم و مطمئن در طول مکالمه بین کلاینت و سرور وجود ندراد.

همانطور که در مقاله قبلی سعی شد مراحل برقراری اتصال از نوع TCP به بصورت مجزا توضیح داده بشه اینبار هم مراحل برقراری اتصال از نوع UDP رو به صورت قدم به قدم ارائه میشه.

بخش سرور:
پیاده سازی بخش سرور شامل نه مرحله به شرح زیر می باشد:

1- ایجاد سوکت دیتا گرام (Datagram Socket object):

آرگومان ایجاد دیتا گرام سوکت، یک شماره پورت آزاد می باشد که از محدوده پورت های غیر رزرو (1024 تا 65535) باید انتخاب شود.






DatagramSocket mydgSock =new DatagramSocket (1234);


در این مثال یک دیتاگرام سوکت با نام mydgSock بر روی پورت 1234 تعریف شده است.

2-تعریف یک بافر برای دیتا گرامهای دریافتی:
برای این منظور کافیست آرایه ای از نوع بایت معرفی کنید.



byte[] mybuff = new byte[256];
در اینجا بافری با نام mybuff و با ظرفیت 256 معرفی شده است.

3- ایجاد بسته های دیتا گرام(DatagramPacket object )برای دیتا گرامهای دریافتی:
سازنده این شی به دو آرگومان به شرح زیر نیاز دارد:
·آرایه از نوع بایت که در مرحله دوم معرفی کردیم.
·سایز این آرایه.






DatagramPacket inpack =new DatagramPacket (mybuff, mybuff.length);


4-پذیرش دیتا گرام های دریافتی:
این کار توسط متد receive از شی دیتاگرام سوکت صورت می پذیرد:




mydgSock.receive (inpack);










5-استخراج آی پی و شماره پورت فرستنده از بسته دریافتی:

متدهای getAddress() و getPort() از بسته های دیتا گرام (DatagramPacket object ) برای این منظور استفاده می شوند.



InetAddress clientAdd = inPack.getAddress ();



int cPort = inPack.getPort ();

در مثال فوق مقدار آدرس آی پی در متغیر clientAdd ذخیره می شود که آنرا از نوع InetAddress معرفی کردیه ایم همچنین مقدار پورت در متغیر cPort که از نوع عددی میباشد ذخیره میشود.

در این مرحله قادر به تشخیص این موضوع هستیم که بسته دریافتی از کدام آدرس و از طریق چه پورتی برای ما ارسال شده است.

6-استخراج اطلاعات از بسته دریافتی:

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





String message = new String (inpack.getData (), 0, inpack.getLength ());


7-ایجاد دیتا گرام پاسخ یا به زبون خودمون ایجاد جواب:

خوب بسته پاسخ ما هم از جنس DatagramPacket object می باشد که نیاز به چهار آرگومان دارد:
·آرایه بایتی شامل پیام مورد نظر برای ارسال.
·سایز پیام ارسالی.
·آدرس گیرنده (کلاینت)
·شماره پورت گیرنده (کلاینت)

آرگومان اول با اجرای متد getBytes() بر روی متغیر رشته ای که برای ارسال پاسخ در نظر گرفته شده است به دست می آید در این مقاله فرض بر این است که ما متغیری با نام response و طبعا از نوع رشته ای برای پاسخگویی تعریف کرده ایم.




String response=”just for test”;







در واقع response متغیری است که پاسخ را در خود ذخیره کرده.آدرس و پورت گیرنده هم در واقع همان آدرس و پورت فرستنده میباشد گه در مرحله پنج از بسته دریافتی بدست آمد با این توضیحات ایجاد پاسخ به راحتی به شکل زیر صورت میگیرد:




DatagramPacket outPack =new DatagramPacket (response.getBytes (), response.length (), clientAdd, cPort);

8-ارسال پاسخ ایجاد شده:

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





mydgsock.send (outPack);


9-بستن سوکت دیتاگرام:
این کار به راحتی و تنها با صدا زدن متد close() پایان می پذیرد.





mydgSock.close ();


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

1-ایجاد سوکت دیتا گرام (Datagram Socket object):
این مرحله مانند مرحله یک در بخش سرور می باشد با این تفاوت که در اینجا نیازی به وارد کردن آدرس پورت به عنوان آرگومان ورودی نیست:




DatagramSocket mydgSock = new DatagramSocket ();



2-ایجاد دیتاگرام خروجی:
این بخش مشابه بخش هفتم از آماده سازی سرور می باشد:




DatagramPacket outPack =new DatagramPacket (message.getBytes (),message.length (), host, PORT);

در واقع message متغیری است که رشته مورد نظر برای ارسال را در خود ذخیره نموده است.

3-ارسال پیام:




mydgsock.send (outPack);




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

4-تعریف یک بافر برای دیتا گرامهای دریافتی:




byte[] mybuff = new byte[256];


5- ایجاد بسته های دیتا گرام(DatagramPacket object )برای دیتا گرامهای دریافتی:


DatagramPacket inpack =new DatagramPacket (mybuff, mybuff.length);
6-پذیرش دیتا گرام های دریافتی:




mydgsock.receive (inpack);



7-باز یابی اطلاعات از بافر:
دقیقا مشابه مرحله شش از بخش سرور:


String message = new String (inpack.getData (), 0, inpack.getLength ());

8-بستن سوکت دیتاگرام:




mydgSock.close ();



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

manvaputra
شنبه 23 شهریور 1387, 18:41 عصر
مثال به زودی

manvaputra
شنبه 23 شهریور 1387, 20:17 عصر
خوب دوستان عزیز سلام اینم همون برنامه چت که در بخش TCP نوشته شده بود اینباد همون چت با UDP پیاده سازی شده:


کد مربوط به سرور:


import java.io.*;
import java.net.*;
import java.util.*;
public class UDPserver {

public static void main(String[] args) throws Exception {
DatagramSocket mydgSock =new DatagramSocket (1234);
byte[] mybuff = new byte[256];
String response;
do{


DatagramPacket inpack =new DatagramPacket (mybuff, mybuff.length);
mydgSock.receive (inpack);

InetAddress clientAdd = inpack.getAddress ();
int cPort = inpack.getPort ();
String message = new String (inpack.getData (), 0, inpack.getLength ());
System.out.println(message);
Scanner inp = new Scanner(System.in);
response=inp.next();


DatagramPacket outPack =new DatagramPacket (response.getBytes (), response.length (), clientAdd, cPort);

mydgSock.send (outPack);
}while (!response.equals("Q"));
mydgSock.close ();

}
}



کد مربوط به کلاینت:


import java.io.*;
import java.net.*;
import java.util.*;
public class UDPclient {

public static void main(String[] args) throws Exception {

DatagramSocket mydgSock = new DatagramSocket ();
Scanner s=new Scanner(System.in);
String message;
String message1;
// DatagramPacket outPack;
do{

message=s.next();
DatagramPacket outPack =new DatagramPacket (message.getBytes (),message.length (), InetAddress.getLocalHost(), 1234);
mydgSock.send (outPack);


byte[] mybuff = new byte[256];
DatagramPacket inpack =new DatagramPacket (mybuff, mybuff.length);

mydgSock.receive (inpack);
message1 = new String (inpack.getData (), 0, inpack.getLength ());
System.out.println(message1);
}while(!message1.equals("Q")) ;
mydgSock.close ();

}
}



نکات:
1- طبیعاتا اول برنامه سرور باید اجرا بشه.
2- کلاینت شروع کننده و خاتمه دهنده چت می باشد.
3-مکالمه باید یک در میان باشه یعنی کلاینت یه چیزی بگه بعد سرور جواب بده مجددا نوبت کلاینت میشه.
4- مکالمه با ارسال Q از طرف کلاینت خاتمه پیدا میکنه.


دوستان عزیز اینبار هم عرض می کنم خدمتتون که این نمونه کد برای نوشتن چت نیست برای همین از دیدگاه چتی بش نگاه نکنید :چشمک: فقط برای این بود که آموزش بالا بصورت کاربردی نمایش داده بشه امیدوارم که به مفید باشه.