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

مشكلة في القراءة عبر برنامج Client Server ؟؟؟

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

السلام عليكم يا إخوة ..

واجهتني مشكلة لا أدري ما سببها.

في طرف السيرفر عندما أقوم بالإرسال فإنه يتم الإستقبال من الطرف الاخر و هو Client , لكن بعد فترة من النجاح في الإرسال و الإستقبال يحدث التالي :

يصبح الزبون في حالة انتظار لأن يقرأ البيانات الواردة من السيرفر لكنه لا يستطيع و يبقى في حالة توقف .. و حقيقة لا أدري ما سبب ذلك.

الكود المسئول عن النقل في السيرفر :

protected static void watchRemotely(String name){
        try {
            int index = findClient(name);
            ClientRecord client = clients.get(index);
            client.getOutStream().writeUTF(Marks.SEND_DESKTOP);

            int width = client.getInStream().readInt();
            int heigh = client.getInStream().readInt();

            int nwidth = width / 2;
            int nheigh = heigh / 2;

            RemoteDeskTopFrame frame = new RemoteDeskTopFrame();
            frame.setSize(nwidth, nheigh);
            frame.setVisible(true);

            boolean reciveNow = true;
            Graphics g = RemoteDeskTopFrame.rdf.getGraphics();

            while( reciveNow ){
                byte[] buf = new byte[1280000];
                client.getInStream().read(buf);

                int x = client.getInStream().readInt();
                int y = client.getInStream().readInt();

                ByteArrayInputStream bas = new ByteArrayInputStream(buf);
                BufferedImage img = ImageIO.read(bas);
                g.drawImage(img, 0, 0, nwidth, nheigh, frame);
                g.drawRect(x, y, 10, 10);

                RemoteDeskTopFrame.rdf.repaint();

                client.getOutStream().writeUTF("-nothing");

            }

        } catch (IOException ex) {
            Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

الكود الخاص بالنقل و الإستقبال من الزبون :

class Recive implements Runnable{

        public void run() {
            String mark;
            while (true) {
                try {
                    mark = in_stream.readUTF();

                    if( mark.equals(Marks.SEND_DESKTOP) ){
                       Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
                       int width = dim.width;
                       int heigh = dim.height;

                       out_stream.writeInt(width);
                       out_stream.writeInt(heigh);

                       boolean sendNow = true;
                       Robot robot = new Robot();
                       BufferedImage img = null;
                       Point point;

                       while( sendNow ){
                           img = robot.createScreenCapture(new Rectangle(dim));
                           ByteArrayOutputStream stream = new ByteArrayOutputStream();
                           ImageIO.write(img, "jpg", stream);
                           byte[] buf = stream.toByteArray();
                           out_stream.write(buf);
                           out_stream.flush();

                           System.out.println("0");
                           point = MouseInfo.getPointerInfo().getLocation();

                           int x = point.x;
                           int y = point.y;

                           out_stream.writeInt(x);
                           out_stream.writeInt(y);

                           mark = in_stream.readUTF();

                           if( mark.equals(Marks.STOP_MONITOR) )
                               sendNow = false;
                           else
                            Thread.sleep(100);
                       }
                    }

                } catch (InterruptedException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                } catch (AWTException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        }
    }

حتى أكون دقيق أكثر المشكلة ظهرت بعد إدخال الكود التالي إلى السيرفر : و هو الكود الخاص بإستقبال قيم x و y من الزبون ..

int x = client.getInStream().readInt();
                int y = client.getInStream().readInt();

و أيضا الكود التالي في طرف الزبون :

int x = point.x;
                           int y = point.y;

                           out_stream.writeInt(x);
                           out_stream.writeInt(y);
#2

هل يظهرلك Exception يقولك java heap space.......etc أو شئ من هذا القبيل؟؟ إذا كان كذا جرب تسوي reset أو flush بعد هذه

اقتباس
client.getOutStream().writeUTF("-nothing");

ممكن ترفع السورس كامل؟

على فكره , ليش ماتسوي ريفرينس للـoutstream والـinstream بدل ما تتعب الأخ كل شويه يجيبلك عنوانه happy.gif

تم تعديل هذه المشاركة بواسطة M.Allaw في 2 مارس 2010 في 00:21


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#3

هل أنت متأكد أن عملية الكتابة لا تتم قبل عملية القراءة

أقصد في عادة جميع البروتكولات يرسل الجهاز1 البيانات فيرد عليه الجهاز2 بتأكيد acknowledgment

فيرسل الرسالة الثانية فيرد عليه تأكيد ثاني وهكذا

تحياتي

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

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

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

728x90.png

#4
M.Allaw كتب:

هل يظهرلك Exception يقولك java heap space.......etc أو شئ من هذا القبيل؟؟ إذا كان كذا جرب تسوي reset أو flush بعد هذه

ممكن ترفع السورس كامل؟

على فكره , ليش ماتسوي ريفرينس للـoutstream والـinstream بدل ما تتعب الأخ كل شويه يجيبلك عنوانه happy.gif

الغريب أنه لا يحدث أي Exception من الذين ذكرتهم , ولقد جربت استخدام Flush ,, أيضا بدون فائدة ..

بالنسبة لحكاية ال Reference ,, فأنت محق سوف أنظر في أمرها .

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

هل أنت متأكد أن عملية الكتابة لا تتم قبل عملية القراءة

أقصد في عادة جميع البروتكولات يرسل الجهاز1 البيانات فيرد عليه الجهاز2 بتأكيد acknowledgment

فيرسل الرسالة الثانية فيرد عليه تأكيد ثاني وهكذا

تحياتي

بالتأكيد يا علاء .. حيث أن العملية تنجح في البداية لمرتين أو ثلاث مرات و بعدها يتوقف طرف Client عن قراءة الجملة التالية :

mark = in_stream.readUTF();

تم تعديل هذه المشاركة بواسطة MKSoft في 2 مارس 2010 في 08:02

#5

هل عرفت بالضبط أين تتوقف العملية؟

قم بعمل debug بسيط وأخبرنا

تحياتي

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

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

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

728x90.png

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

هل عرفت بالضبط أين تتوقف العملية؟

قم بعمل debug بسيط وأخبرنا

تحياتي

حقيقة يا علاء بعد عملية الفحص .. اكتشفت مكان المشكلة و الله أعلم و حقيقة أنا عاجز عن حلها ..

المشكلة تكمن في الكود التالي و الموجود في السيرفر..

int x = client.getInStream().readInt();
int y = client.getInStream().readInt();

حيث أن هذا الكود هو المسئول عن استقبال مكان مؤشر الفأرة الموجود على جهاز الزبون Client ..

لكن النتائج بعد عملية Debug كانت كالتالي :

عندما يرسل الزبون مكان المؤشر بشكل سليم و صحيح ... يستقبل السيرفر النتائج بشكل خاطيء .. انظر العملية أسفل ..

نتائج ارسال مكان مؤشر الفأر

Client send deskto stream ..
Client send Mouse Position x,y :=  [251,483]
Client recive mark := -nothing
************************************************************
Client send deskto stream ..
Client send Mouse Position x,y :=  [210,467]
Client recive mark := -nothing
************************************************************

في المقابل النتائج من طرف السيرفر .. و هو استقبال خاطيء لكل القيم السابقة ..

watchRemotely | Buffer is prepared by Server
watchRemotely | Server recive the stream and fill into Buffer..
watchRemotely | Server recive Mouse Position x,y := [-1545785884,907132601]
watchRemotely | Server send << -nothing >> mark into client..
************************************************************
watchRemotely | Buffer is prepared by Server
watchRemotely | Server recive the stream and fill into Buffer..
watchRemotely | Server recive Mouse Position x,y:= [1189746789,1171437859]
watchRemotely | Server send << -nothing >> mark into client..
************************************************************

لا حظ الفرق ..

ففي الوقت الذي أرسل الزبون القيم التالية : [251,483] كان استقبال السيرفر [-1545785884,907132601] .. ؟؟؟؟ !!!!

#7

did you think about converting data from integer to another type??

try to use long instead

#8
Mohammed Mshari Ersan كتب:

did you think about converting data from integer to another type??

try to use long instead

للأسف لم تنجح العملية أبدا.

#9

محمد هلا أوقفت عملية إرسال الصورة وجربت مرة أخرى؟

شيء آخر ارفع الملفات في ملف مضغوط هنا على الموقع

تحياتي

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

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

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

728x90.png

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

محمد هلا أوقفت عملية إرسال الصورة وجربت مرة أخرى؟

إذا قمت بتلك الطريقة فإن العملية تنجح ويصبح استقبال السيرفر للقيم صحيح .

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

شيء آخر ارفع الملفات في ملف مضغوط هنا على الموقع

المرفقات :

Server Project

البرنامج الرئيسي ضمن الملف السابق هو Main ,, و الملف الذي يقوم بعملية الاتصال اسمه ServerConnection .

RemoteController.rar

Client Project

RemoteClient.rar

#11

اكتب الجملة التالية بعد عملية إرسال الصورة

out_stream.flush();

بإذن الله سيعمل كل شيء مئة بالمئة

تحياتي

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

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

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

728x90.png

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

اكتب الجملة التالية بعد عملية إرسال الصورة

out_stream.flush();

بإذن الله سيعمل كل شيء مئة بالمئة

تحياتي

للأسف لم تنجح العملية لأني جربتها كثيرا بدون فائدة ..

#13

لا أعرف يا محمد لكني كتبتها بعد كل عملية write

واشتغل البرنامج معي مئة بالمئة

تحياتي

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

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

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

728x90.png

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

لا أعرف يا محمد لكني كتبتها بعد كل عملية write

واشتغل البرنامج معي مئة بالمئة

تحياتي

هههههههههههههه

يبدو أن البرنامج يعمل على حسب الأهواء.

على العموم ما قصرت يا أستاذي , جراك ربي خيرا .

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