سؤال
أحاول تطوير عميل 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 وحاول قراءة ذلك.
في تطبيق مطابق يجب أن يعود على الفور وعدم قراءة أي شيء ، ولكن يمكنك بسهولة تشغيل خطأ في تنفيذ أقل من مثالي مع ذلك.