التعامل مع الشبكات فى الجافا Java Networking

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

التعامل مع الشبكات فى الجافا Java Networking

مُساهمة من طرف أحمد مناع في الجمعة يونيو 14, 2013 6:43 pm

بسم الله الرحمن الرحيم  

الاخوة الاعزاء اهلا وسهلا بكم ......فى هذا الدرس التعليمى إن شاء الله تعالى سنتعلم سويا كيفية التعامل مع الشبكات فى الجافا ....حيث تمكنك الجافا من الاتصال بالشبكات سواء من خلال بروتوكول TCP / IP أو من  بروتوكول UDP وسيتم شرح كل طريقه من خلال هذا الدرس 

اولا : الاتصال بالشبكات من خلال بروتوكول TCP / IP

يعتبر بروتوكول TCP/IP من أهم البروتوكولات الموجوده من أجل التخاطب في الشبكات و يعتبر الان لغة التخاطب الوحيده في الانترنت و يوجد العديد من لغات التخاطب ما بين القطع و المعدات في الشبكه الواحده و لكن الـ TCP/IP يعتبر البروتوكول الرئيسي و بذلك لغة التخاطب هذه هي اللغه الافضل و الأكثر شيوعاً في العالم ..

وطريقة الاتصال من خلال هذا البروتوكول بأن يقوم العميل بطلب اتصال مع الخادم ...ثم يبدأ العميل عملية الاتصال مع الخادم ...ثم يقوم بعد ذلك بغلق عملية الاتصال كما فى المخطط التالى :


 أ_ أستخدام الفئة java.net.Socket لفتح اتصال مع الملقم  

عندما نريد فتح اتصال ما بين الخادم و العميل من خلال بروتوكول TCP / IP فأننا نستخدم فى ذلك  الفئة  Socket و التى يتم تمير اليها عنوان IP ومنفذ TCP للاتصال وذلك عن طريق الخطوات التالية :



1_ من اجل الاتصال بمقلم على الانترنت عن طريق بروتوكول  TCP / IP يجب اولا اتسيراد المكتبة اللازمة وذلك باستخدام الكود التالى :


الرمز:

import java.net.Socket;

2_ نقوم بعد ذلك بخلق كائن جديد من Socket ثم نقوم بتمرير رقم الاى بى للخادم المطلوب الاتصال به على الشبكة من خلال المنفذ 80 و ذلك بأستخدام الكود التالى :

الرمز:
Socket socket = new Socket("78.46.84.171", 80);

كما يمكنك استخدام اسم النطاق بدلا من رقم الاى بى الخاص بالخادم المراد الاتصال به وذلك على النحو التالى :

الرمز:
Socket socket = new Socket("forumegypt.net", 80);

3_ الكتابة الى العميل ....الاكواد السابقة هى لمجرد فتح اتصال بالمقلم فقط ....لكن ماذا اذا اردنا الكتابة الى المقلم ؟....لنستطيع فعل ذلك سوف نستخدم الكائن OutputStream و هو احد الكائنات الخاصة بالفئة JAVA.IO و ذلك على النحو التالى :

الرمز:
Socket socket = new Socket("forumegypt.net", 80);
OutputStream out = socket.getOutputStream();

out.write("some data".getBytes());
out.flush();
out.close();

socket.close();

4_ القراءة من الملقم ...لكى تستطيع القراءة من الملقم يجب استخدام الكائن InputStream و ذلك على النحو التالى :

الرمز:
Socket socket = new Socket("orumegypt.net , 80);
InputStream in = socket.getInputStream();

int data = in.read();
//... read more data...

in.close();
socket.close();



ب _ أستخدام الفئة java.net.ServerSocket لتشغيل الخادم

إذا كنا نرغب في تشغيل الخادم الذي يستمع للاتصالات الواردة من العميل على منفذ TCP..فعلينا استخدام الفئة ServerSocket و ذلك على النحو التالى :

1_ استيراد المكتبة اللازمة و ذلك من خلال الكود التالى :

الرمز:
import java.net.ServerSocket;

2_ نقوم بعد ذلك بخلق كائن جديد من ServerSocket و الذى سيقوم بالاستماع للاتصال الوارد من خلال المنفذ 9000 و ذلك بأستخدام الكود التالى :

الرمز:
ServerSocket serverSocket = new ServerSocket(9000);

 
3_ من أجل قبول الاتصالات الواردة يجب استدعاء الاسلوب ServerSocket.accept و ذلك من خلال الكود التالى :

الرمز:
ServerSocket serverSocket = new ServerSocket(9000);

boolean isStopped = false;
while(!isStopped){
    Socket clientSocket = serverSocket.accept();

    //do something with clientSocket
}

4_ إغلاق منفذ العميل ....وذلك من خلال الكود التالى :

الرمز:
socket.close();

5_ إغلاق منفذ الخادم من خلال الكود التالى :

الرمز:
serverSocket.close();


ج _ أستخدام الفئتين URL + URLConnection لاتصال خوادم الويب (ملقمات HTTP) :

 حزمة java.net تحتوي على فئتين مثيرة للاهتمام هما .....الفئة URL و الفئة URLConnection وهذه الفئات يمكن استخدامها لإنشاء اتصالات بخوادم الويب (ملقمات HTTP). هنا مثال بسيط:

الرمز:
URL url = new URL("http://jenkov.com");

URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();

int data = input.read();
while(data != -1){
    System.out.print((char) data);
    data = input.read();
}
input.close();

كما ترون فى المثال أعلاه قمنا بالاتصال بخادم ويب و استطعنا أن نقرأ البيانات منه حيث URLConnection يرسل طلب GET إلى خادم الويب HTTP .....أما  إذا كنت ترغب في إرسال طلب  POST  الى خادم  HTTP  نقوم بأستدعاء الاسلوب  URLConnection.setDoOutput(true)  مثل هذا:

الرمز:
URL url = new URL("http://jenkov.com");

URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);

و بمجرد تعين الاسلوب  setDoOutput تساوى  true يمكنك بسهولة الكتابة الى الخادم بأستخدام الطريقة  OutputStream  كما فى المثال التالى :

الرمز:
OutputStream output = urlConnection.getOutputStream();

 وهكذا بأستخدام OutputStream يمكنك كتابة أي البيانات التي تريدها الى خوادم HTTP.  تذكر أن تقوم بإغلاق OutputStream عند الانتهاء كتابة البيانات إليه

د_ الاتصال بالملفات المحلية local file system 

الفئة URL يمكنك استخدامها ايضا للوصول إلى الملفات في نظام الملفات المحلية.و بالتالى فانها وسيلة في متناول اليد لفتح ملف معين وذلك من خلال الكود التالى :

الرمز:
URL url = new URL("file:/c:/data/test.txt");

URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();

int data = input.read();
while(data != -1){
    System.out.print((char) data);
    data = input.read();
}
input.close();

وكما ترى فى ألكود أعلاه ....لاحظ أن الفرق الوحيد من الوصول إلى ملف على خادم الويب HTTP هو عنوان URL أما عبر الملفات المحلية نتسخدم المسار  "file:/c:/data/test.txt"

هـ _ أستخدام الفئة JarURLConnection للاتصال بملف jar عبر الويب .

الفئة JarURLConnection يستخدم  للاتصال إلى ملف jar. مرة واحدة و يمكنك الحصول على معلومات حول محتويات الملف jar و هنا مثال بسيط

الرمز:
String urlString = "http://butterfly.jenkov.com/"
                 + "container/download/"
                 + "jenkov-butterfly-container-2.9.9-beta.jar";

URL jarUrl = new URL(urlString);
JarURLConnection connection = new JarURLConnection(jarUrl);

Manifest manifest = connection.getManifest();


JarFile jarFile = connection.getJarFile();

//do something with Jar file...

...    


ثانيا : الاتصال بالشبكات من خلال بروتوكول UDP 

بروتوكول UDP هو أختصار للجملة الانجليزية User Datagram Protoco هو بروتوكول يسمح بتناقل البيانات مثل TCP مع بعض الاختلافات الجوهرية من حيث طريقة التوصيل والتأكد من صحة المعلومات وسرعة التوصيل واحتمال الضياع. ....ففى طريقة التوصيل مثلا يقسم هذا ال بروتوكول البيانات المراد إرسالها إلى وحدات تسمى كل وحدة (datagram) ومن هنا يأتي الاختلاف مع TCP حيث يوضع مع كل وحدة عنوان المرسل إلية وليس مثل TCP الذي يقوم بفتح اتصال مباشر مع الطرف الاخر ثم يرسل البيانات, حيث أنه هنا كل وحدة مستقلة في طريقها عن باقي الوحدات فربما كل وحدة تسلك طريقاَ أخر عن غيرها وثم يقوم الطرف الاخر بتجميعها ......ويتم فتح اتصال مع الشبكات عبر هذا البروتوكول من خلال الفئات التالية :

1_ أستخدام الفئة DatagramSocket لارسال البيانات .

لإرسال البيانات عبر بروتوكول UDP  باستخدام الفئة DatagramSocket يجب عليك أولا إنشاء DatagramPacket .....وذلك من خلال الكود التالى :

الرمز:
byte[] buffer = new byte[65508];
InetAddress address = InetAddress.getByName("jenkov.com");

DatagramPacket packet = new DatagramPacket(
    buffer, buffer.length, address, 80);

وكما ترون أعلاه .... قمنا فى السطر الاول بإنشاء المخزن المؤقت بايت (صفيف البايت) لتخزين البيانات التي سيتم إرسالها في مخطط بيانات UDP. طول المخزن المؤقت أعلاه، 65508 بايت، هو الحد الأقصى لمقدار البيانات التي يمكن إرسالها في حزمة واحدة عبر بروتوكول UDP  

 و فى السطر الثانى أستخدمنا الفئة InetAddress لانشاء كائن جديد يحتوي على عنوان الويب (مثل الخادم) لإرسال حزمة البيانات الى UDP . و InetAddress فئة يمثل عنوان IP (عنوان إنترنت). و getByName() الأسلوب بإرجاع InetAddress مثيل مع عنوان IP مطابقة اسم المضيف معين. 

لإرسال DatagramPacket يجب إنشاء DatagramSocket تستهدف إرسال البيانات. وذلك كما يلى :

الرمز:
DatagramSocket datagramSocket = new DatagramSocket();

ثم نقوم بعد ذلك بارسال البيانات من خلال استدعاء الاسلوب  send كما فى الكود التالى :

الرمز:
datagramSocket.send(packet);

و بالتالى فاإن الكود بالكامل لارسال البيانات عبر بروتوكول UDP سيكون على النحو التالى :

الرمز:
atagramSocket datagramSocket = new DatagramSocket();

byte[] buffer = "0123456789".getBytes();
InetAddress receiverAddress = InetAddress.getLocalHost();

DatagramPacket packet = new DatagramPacket(
        buffer, buffer.length, receiverAddress, 80);
datagramSocket.send(packet);

2_ أستخدام الفئة DatagramSocket لاستقبال البيانات . 

استقبال البيانات عبر DatagramSocket يتم ذلك عن طريق إنشاء DatagramPacket ثم تلقي البيانات الى DatagramSocket من خلال الاسلوب  receive وفيما يلي مثال:

الرمز:
DatagramSocket datagramSocket = new DatagramSocket(80);

byte[] buffer = new byte[10];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

datagramSocket.receive(packet);

وبعد ذلك يمكنك الحصول على المخزن المؤقت من خلال الكود التالى :

الرمز:
byte[] buffer = packet.getData();


والى هنا نكون قد انتهيا من هذا الدرس الى اللقاء ان شاء الله تعالى فى درس جديد Very Happy


ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: التعامل مع الشبكات فى الجافا Java Networking

مُساهمة من طرف ذوكا في السبت يونيو 15, 2013 11:29 am

شرح رائع ....مشكور يا اخى الكريم

ذوكا
.....
.....

تاريخ التسجيل : 26/05/2013
المساهمات : 92
النقاط : 155
التقيم : 11
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى