سؤال

أحاول تطوير عميل TCP يعمل على الأجهزة المحمولة باستخدام MIDP 2.0 و CLDC 1.1. أحاول بعض الكود ، ولدي المشكلة التالية:

أحصل على استثناء غريب عندما أحاول قراءة البيانات مرة أخرى (من Midlet).

هذا هو الكود الخاص بي:

            //Wait for an incoming message
            firstByte = in.read();
            ByteArrayOutputStream textRecieved = new ByteArrayOutputStream();   //Will be used to hold the data
            if (firstByte >= 0 )
            {                    
                int messageSize = this.in.available();

                //Read the message
                while (messageSize > 0)
                {
                    byte[] buffer = new byte[messageSize];  
                    this.in.read(buffer);
                    textRecieved.write(buffer);
                    messageSize = this.in.available();   //Just in case the server sent the request in chunks.
                    System.out.println("Reading...");
                }
            }
            textRecieved.close();

هذا هو الاستثناء الذي أحصل عليه:

java.io.IOException: Unknown error 10053 during socket::read 
        at com.sun.midp.io.j2me.socket.Protocol.read0(), bci=0
        at com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(), bci=12
        at com.sun.midp.io.BufferedConnectionAdapter.readBytes(), bci=36
        at com.sun.midp.io.BaseInputStream.read(), bci=227
        at com.sun.midp.io.BufferedInputStream.fill(), bci=172
        at com.sun.midp.io.BufferedInputStream.read(), bci=16
        at hello.Client.run22222(Client.java:60)
        at hello.HelloMIDlet.startApp(HelloMIDlet.java:193)
        at javax.microedition.midlet.MIDletTunnelImpl.callStartApp(), bci=1
        at com.sun.midp.midlet.MIDletPeer.startApp(), bci=7
        at com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=269
        at com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
        at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
        at com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
        at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

الخط الذي يسبب الاستثناء هو:

firstByte = in.read();

أنا أقرأ على موضوع منفصل. لقد واجهت نفس الخطأ عندما أرسلت الطلبات وحاولت قراءتها باستخدام الخادم نفسه. الخادم هو خادم صدى بسيط ، لا شيء معقد.

ملاحظة: أعلم أن الطريقة التي يتم بها كتابة الكود تبدو مثل C#، لكنها Java ، أجد أنه من الأسهل القراءة ومتابعة بهذه الطريقة.

شكرًا.

هل كانت مفيدة؟

المحلول 2

يبدو أن هذا المثال يعمل:http://www.java-samples.com/j2me/socket-connection-free-j2me-sample-program.htm

هل يمكن أن تكون المشكلة هي أنني كنت أقوم بتنفيذ العميل كفصل يدعى Midlet؟

نصائح أخرى

أول شيء أراه هو أنك سوء استخدام available(). على الأرجح لا افعل ما تأمل أن يفعله.

available() يعيد تقدير. يستمر Javadoc في ذكر هذا بشكل صريح:

ليس من الصحيح أبدًا استخدام قيمة إرجاع هذه الطريقة لتخصيص مخزن مؤقت يهدف إلى الاحتفاظ بجميع البيانات في هذا الدفق.

يمكن أن تعود بشكل جيد فقط 0, ، في هذه الحالة ، تخصيص مخزن مؤقت للحجم 0 وحاول قراءة ذلك.

في تطبيق مطابق يجب أن يعود على الفور وعدم قراءة أي شيء ، ولكن يمكنك بسهولة تشغيل خطأ في تنفيذ أقل من مثالي مع ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top