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

مشكلة في الإستقبال من خادمين Two Servers ؟؟؟

بدأه MKSoft في 15 فبراير 2010 · 8 رد · 602 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

عندي مشكلة أتمنى ان تكون بسيطة في Socket . وهي كالتالي :

برنامج يتكون من ثلاث أقسام و هم Server1 و Server2 و Client

طريقة لإتصال بالشكل التالي :

Server1 هو الخادم الرئيسي ويقدم خدمة معينة.

Server2 خادم ثاني و يقدم خدمة ثانية , وفي نفس اللحظة متصل مع الخادم الأول Server1

Client متصل مع Server2 .

يقوم Client بطلب الخدمة من Server2 فإن كانت موجودة الخدمة عليه يتم الإرسال الخدمة و هي في البرنامج الرسالة التالية : Server2 serve you..

في حال أن Client ارسل إلى Server2 الإشارة التالية "+" يعني أن الخدمة موجود على Server1 , و من المفترض أن يرسل Server1 الرسالة التالية : Server1 serve you..

إلى Server2 , بدوره Server2 يرسلها إلى Client .

المشكلة :

تكمن المشكلة في أنه في حالة ارسال الإشارة الدالة على أن الخدمة متوفرة على Server1 و هي إشارة "+" , فإنه يتم إرسال رد لـ Client بنجاح ,, لكن فقط لمرتين , وبعد المرتين لايكون هناك أي رد

الكود :

Server1

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {
    ServerSocket srv;
    public Server1() throws IOException{
        srv = new ServerSocket(12500);
        System.out.println("Server1 : Prepare Connection at 12500 PORT ");
        System.out.println("Server1 : wail.. for Server2 ");
        Socket socket = srv.accept();
        System.out.println("Server1 : Accept Server2 ");

        DataInputStream read = new DataInputStream(socket.getInputStream());
        DataOutputStream write = new DataOutputStream(socket.getOutputStream());

        while(true){

            String value = read.readUTF();
            write.writeUTF("Server1 serve you..");
        }
    }
    public static void main(String[]args) throws IOException{
        new Server1();
    }
}

Server2

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Server2 {
    ServerSocket srv;
    DataOutputStream mainOut;
    DataInputStream mainIn;
    public Server2() throws IOException{

        Socket cs = new Socket(InetAddress.getLocalHost(), 12500);

        mainOut = new DataOutputStream(cs.getOutputStream());
        mainIn = new DataInputStream(cs.getInputStream());

        srv = new ServerSocket(6500);
        System.out.println("Server2 : Prepare PORT 6500 ");
        while( true ){
            System.out.println("Server2 : wail.. ");
            Socket socket = srv.accept();
            System.out.println("Server2 : accept new client ");
            DataInputStream in = new DataInputStream(socket.getInputStream());
            DataOutputStream out = new  DataOutputStream(socket.getOutputStream());

            Thread2 t = new Thread2(in, out);
            Thread t2 = new Thread(t);
            t2.start();

        }
    }


    public static void main(String[]args) throws IOException{
        new Server2();
    }
    public class Thread1 implements Runnable{

        DataOutputStream out;
        public Thread1(DataOutputStream out) throws IOException{
            this.out = out;
        }
        public void run(){
            while(true){
                try {
                    String resp = mainIn.readUTF();
                    out.writeUTF(resp);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
    public class Thread2 implements Runnable{

        DataInputStream in;
        DataOutputStream out;
        public Thread2(DataInputStream in,DataOutputStream out) throws IOException{
            this.in = in;
            this.out = out;
        }
        public void run(){
            while(true){
                try {
                    String value = in.readUTF();

                    if (value.equals("+")) {
                        java.lang.Thread t = new java.lang.Thread(new Thread1(out));
                        t.start();

                        mainOut.writeUTF(value);

                    } 
		    else 
                        out.writeUTF("Server2 serve you..");

                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

}

Client

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Client extends Thread{
    static Socket socket;
    static DataOutputStream out;
    static DataInputStream in;
    public static void main(String[]args) throws IOException{
        socket = new Socket(InetAddress.getLocalHost(), 6500);

        out = new DataOutputStream(socket.getOutputStream());
        in = new DataInputStream(socket.getInputStream());
        Client c = new Client();
        c.start();
        Scanner scn = new Scanner(System.in);
        System.out.println("Client>> ");
        String value = scn.next();
        System.out.println("Client>> ");
        while(!value.equals("exit")){
            out.writeUTF(value);
            out.flush();
            System.out.println("Client>> ");
            value = scn.next();
        }
        System.exit(0);
    }
    @Override
    public void run(){
        while(true){
            try {
                System.out.println(in.readUTF());
            } catch (IOException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
#2

اعتقد أنة الذي حصل هو DeadLock بسبب أنة هناك اكثر من thread من نوع thread1 تحاول تصنع نفس الشي ---> تستقبل من Server1 وترسل الرد للclient

اما ان تجعل كل thread تتبدد بعد كل رسالة :

 public class Thread1 implements Runnable{

        DataOutputStream out;
        public Thread1(DataOutputStream out) throws IOException{
            this.out = out;
        }
        public void run(){

                try {
                    String resp = mainIn.readUTF();
                    out.writeUTF(resp);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    }

أو تنشيء وحدة فقط وأتركها تتعامل مع كل الرسائل من server1 الى client

 public class Thread2 implements Runnable{

        DataInputStream in;
        DataOutputStream out;
  java.lang.Thread t 

        public Thread2(DataInputStream in,DataOutputStream out) throws IOException{
            this.in = in;
            this.out = out;
        }
        public void run(){
            while(true){
                try {
                    String value = in.readUTF();

                    if (value.equals("+")) {
if(t==null)
{
                         t = new java.lang.Thread(new Thread1(out));
                        t.start();
}
                        mainOut.writeUTF(value);

                    } 
                    else 
                        out.writeUTF("Server2 serve you..");

                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

ملحوظة:

لماذا تستخدم ازواج من threads ؟؟؟, استخدم واحدة فقط وستحصل على نفس النتيجة

تم تعديل هذه المشاركة بواسطة Dr.Robert في 15 فبراير 2010 في 13:02

بحثت عن قلمي البارحة فلم أجدة!

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

لم أجد سوى لوحة المفاتيح هذة

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

تتطلع إلي بشفقة..

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

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#3
اقتباس
ملحوظة:

لماذا تستخدم ازواج من threads ؟؟؟, استخدم واحدة فقط وستحصل على نفس النتيجة

شكر أخي الكريم ...

لكن ما قصدك بالجملة السابقة ؟؟؟؟؟

#4

كنت اقصد لماذا تنشيء thread و تضعها داخل thread اخرى لتشغلها؟ انشيء thread و شغلها مباشرة بدون ان تضعها داخل thread اخرى.

اتمنى ان تكون المشكلة انحلت وبالتوفيق اخي الكريم.

تم تعديل هذه المشاركة بواسطة Dr.Robert في 15 فبراير 2010 في 23:22

بحثت عن قلمي البارحة فلم أجدة!

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

لم أجد سوى لوحة المفاتيح هذة

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

تتطلع إلي بشفقة..

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

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#5

فعلا أخي يبدو أن المشكلة كانت في ما يسمى بـ Deadlock .

فعلا لم يخطر ببالي هذا الأمر ..

حتى اني استغنيت عن Thread1 في العمل وقمت بدمج الكود في Thread2 .

شكرا جزيلا على المساعدة..

لكن هل ممكن أتعرف على إسمك أخي !!!

ومنأي البلدان انت ؟

#6

بالمناسبة يا محمد التوقف إلى الأبد أو ما يعرف بـ deadlock

عبارة عن صراع على الموارد

بمعنى الخيط 1 يطلب دالة أ

والخيط 2 يطلب دالة ب هاتان دالتان كل واحدة فيهما تطلب بعضها البعض

بهذا لا خيط 1 يستطيع الفكاك ولا خيط 2 يستطيع الفكاك

ويبقى الاثنين متوقفان في النظام

كنت كتبت مقالة مسبقاً عن مشاكل الخيوط

http://modonat-alaa.freehostia.com/2008/08/%D9%84%D9%85%D8%AD%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D9%88%D9%8A%D8%A9-23-%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7/

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7
MKSoft كتب:

فعلا أخي يبدو أن المشكلة كانت في ما يسمى بـ Deadlock .

فعلا لم يخطر ببالي هذا الأمر ..

حتى اني استغنيت عن Thread1 في العمل وقمت بدمج الكود في Thread2 .

شكرا جزيلا على المساعدة..

لكن هل ممكن أتعرف على إسمك أخي !!!

ومنأي البلدان انت ؟

لا شكر على واجب..

اسمي مازن بانافع وانا من اليمن.

مشكور اخ علاء على المقالة الممتازة

بحثت عن قلمي البارحة فلم أجدة!

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

لم أجد سوى لوحة المفاتيح هذة

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

تتطلع إلي بشفقة..

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

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#8

العفو أخ مازن

كنت أريد أن أستفسر عن موضوع API الخاص بك لا أعرف أين ذهب الملف المرفق

لذا أرجو إعادة رفعه مرة أخرى

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9
علاء الصالحي كتب:

بالمناسبة يا محمد التوقف إلى الأبد أو ما يعرف بـ deadlock

عبارة عن صراع على الموارد

بمعنى الخيط 1 يطلب دالة أ

والخيط 2 يطلب دالة ب هاتان دالتان كل واحدة فيهما تطلب بعضها البعض

بهذا لا خيط 1 يستطيع الفكاك ولا خيط 2 يستطيع الفكاك

ويبقى الاثنين متوقفان في النظام

كنت كتبت مقالة مسبقاً عن مشاكل الخيوط

http://modonat-alaa.freehostia.com/2008/08/%D9%84%D9%85%D8%AD%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D9%88%D9%8A%D8%A9-23-%D9%85%D8%B4%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7/

تحياتي

شكرا يا علاء على المقالة ... فعلا DeadLock يجب اخذه بعين الإعتبار , وهذا ما لم يكن في الحسبان في البرنامج السابق .

مشكورون جميعا .. بارك الله فيكم

Dr.Robert كتب:

لا شكر على واجب..

اسمي مازن بانافع وانا من اليمن.

مشكور اخ علاء على المقالة الممتازة

أهلا فيك أخي مازن , وبأهل اليمن الكرماء .. و أرجو ان تتقبل صداقتي .

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