الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية عمل Multithreading UDP Server؟

بدأه الاخير زمانه في 16 يناير 2012 · 8 رد · 1,189 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد ان اسأل عن كيفية عمل Multithreading UDP Server

في نوع ال TCP نقوم بعمل الثريد بعد دالة ال accept والتي نعرف من خلالها بوصول طلب اتصال من الكلاينت

لكن في ال udp لا وجود لهذه الدالة

فكيف اعرف انه لدي اتصال لكي اقوم بأنشاء ثريد؟

مع الشكر

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم

لست متاكد لكن

في upd يجب ان يرسل الزبون اي packet لكي ناخذ منها معلومات الزبون

هذه تعتبر في مكان accept في الtcp

ام بخصوص سوالك

على عكس الtcp

الudp يكون الاتصال فقط في حال ارسال ال packet

لهذا اظن ان فكرة الthread لا تصلح

***

ان فقط اخمن

بلمناسبة هناك اعضاء مستواهم جيد بخصوص الشبكات ربما سيساعدوك

تحياتى

1
#3

بالاضافة لكلام sahraoui17

ف ال udp لا يوجد connection بين الراسل والمستلم ولكن ال udp server يجاوب كل عميل يقوم بارسال packet له فانت- ك خادم- من الممكن ان تحتاج ان تجهز الرد لل عميل ولكن ذلك الرد من الممكن ان يعتمد على شئ اخر - من الممكن ان يأخذ وقت طويل- لذلك قد تلجأ ان تجهز ذلك الرد ف new thread ولكن تذكر ان ال UDP ان لا يقوم بعمل connection وبالتالي اذا اراد العميل ارسال packet جديدة ستقوم بنفس الخطوات مرة اخرى.

اتمنى ان تكون فهمت وجهة نظري. مرحب باستفساراتك.

تم تعديل هذه المشاركة بواسطة Mina Fouad في 17 يناير 2012 في 02:13

1

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#4

شكرا اخوتي على الرد.

انا بحثت كثيرا في النت ولم اجد مثال على تطبيق multithreading udp server

المشكلة ان البروفسور طلب منا هذا - وكما بينتم انه لا وجود لدالة ال accept وايضا بالاساس البروتوكول هو connection-less

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#5

هل المقصود هو Multicasting باستخدام الـ UDP ؟

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#6

لا فقط عمل multithreading - يعني عمل ثريد مستقل لكل كلاينت يتصل

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#7

حسنا جرب هذا الكود لربما تجد ضالتك به

import java.net.*;
import java.io.*;
public class NewsClient 
{
public static void main(String args[])
{
        MulticastSocket s = null;
        int port = 5000;	                        //(1)
        String group = "225.4.5.6";               //(2)

        try {
            s = new MulticastSocket(port);            //(3)

// join the multicast group
            s.joinGroup(InetAddress.getByName(group));//(4)
            byte buf[] = new byte[1024];
            DatagramPacket pack = new DatagramPacket(buf, buf.length);          //(5)
            String news1 = "";
            do {
                s.receive(pack); 				     //(6)
                news1 = new String(pack.getData(), 0, pack.getLength());
                System.out.println(news1);
                System.out.println();
            } while (true);
        } catch (IOException e) {
            System.out.println(e.toString());
        } finally {
            try {
                s.leaveGroup(InetAddress.getByName(group));  //(9)
                s.close();		   			     //(10)
            } catch (IOException e) {
                System.out.println(e.toString());
            }
        }
    }
}

import java.net.*;
import java.io.*;
import java.util.*;

public class NewsServer {

    protected static BufferedReader in = null;

    public static void main(String args[]) {
        DatagramSocket socket = null;
        MulticastSocket s = null;

        try {
            int port = 5000;
            String group = "225.4.5.6";
            s = new MulticastSocket();
            byte buf[] = new byte[10];

            //////////// Section (1)  ///////////
            try {
                in = new BufferedReader(new FileReader("news.txt"));
            } catch (FileNotFoundException e) {
                System.err.println("Could not open news file.");
            }

            while (true) {               		     //(2)
                String onenews = null;
                if (in == null) {
                    onenews = new Date().toString() + "No news";
                } else {
                    onenews = getNextNews();                //(3)
                }

                buf = onenews.getBytes();
                DatagramPacket pack = new DatagramPacket(buf, buf.length,
                                          InetAddress.getByName(group), port);
                s.send(pack);
                Thread.sleep(10000);                         //(4)
            } // End while
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            s.close();
        }
    }

    protected static String getNextNews() {             //(5)
        String returnValue = null;
        try {
            if ((returnValue = in.readLine()) == null) {   //(6)
                in.close();
                in = new BufferedReader(new FileReader("news.txt"));
                returnValue = in.readLine();
            }
        } catch (IOException e) {
            returnValue = "IOException occurred in server.";
        }
        return returnValue;
    } // end getNextNews
}// end Class
1

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#8

أخي قم باستخدام ThreadPool و دالة الـ Response التي تجيب على كل Request ثم عند وصول أي Packet جديدة قم بعمل submit للـ request في دالة الـ response في الـ ThreadPool. إنشاء Thread لكل طلب جديد هي عملية غير مجدية, و ليست طريقة جدية فعلاً لأن معالجة الطلب و إرسال الرد قد يكون أبسط من إنشاء Thread و إنهائها في كل مرة.

الطريقة الأفضل هي باستخدام Asynchronous Sockets و عندها يصبح من السهل جداً استخدام العدد الذي تحبذه من الـ threads. و لكن سيختلف تصميم البرنامج جذرياً.

تحياتي..

1
#9

الاخ vector_ever - شكرا جزيلا

لكن اظن ان هذا مختلف قليلا - انا لم يسبق لي التعامل مع ال multicast لكن اظن ان المفهوم مختلف عن المطلوب - شاكرا لك.

الاخ خالد - صراحة انا جديد على هذه اللغة ولم يسبق لي التعامل مع ال Asynchronous Sockets ،

سأبحث اكثر في ردك بخصوص هذا الامر - واتمنى ان هذه الطريقة تؤدي الغرض

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

مواضيع مشابهة