Java me MIDP2.0 TCP客户端

Java me MIDP2.0 TCP客户端,java-me,midlet,midp,Java Me,Midlet,Midp,我正在尝试开发一个TCP客户端,它使用MIDP2.0和CLDC 1.1在移动设备上运行。我正在尝试一些示例代码,但遇到以下问题: 当我试图从MIDlet读回数据时,我遇到了一个奇怪的异常 这是我的代码: //Wait for an incoming message firstByte = in.read(); ByteArrayOutputStream textRecieved = new ByteArrayOutputSt

我正在尝试开发一个TCP客户端,它使用MIDP2.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 我在另一条线上阅读。当我发送请求并试图使用相同的服务器读取请求时,我遇到了相同的错误。该服务器是一个简单的echo服务器,并不复杂

另外,我知道代码的编写方式看起来像C#,但它是Java,我发现这样更容易阅读和理解


谢谢。

我看到的第一件事是您错误地使用了
available()
。它很可能不会做你希望它做的事情

。它的JavaDoc接着明确指出:

使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的

它可以很好地返回
0
,在这种情况下,您可以分配一个大小为0的缓冲区,并尝试读取该缓冲区


在一致性实现中,应该立即返回,不读取任何内容,但在不太完美的实现中,您很容易触发错误。

此示例似乎有效:


问题是我将客户机实现为midlet调用的类吗

但是如果有0个字节可用,Read方法不返回-1吗?第一行中的那个吗?可能只有一个字节,我明白。我在考虑制作一个固定大小的缓冲区,然而,因为这就像是一个虚拟的例子,我复制了书中的所有内容,这样我就可以先看看它是如何工作的。不过,感谢您为我指出这一点:)拥有固定数组的一种简单方法是确保流中的前四个字节与即将到来的数据大小一致。读取这四个字节并计算其大小后,就可以创建字节数组了。当然不必是完整的四个字节;取决于你的需要。谢谢你的提示,伙计们,如果你不偏离我首先问的问题,我将不胜感激。顺便说一句,你觉得哪个部分看起来像C?我不明白。我的意思是我放括号和缩进的方式。
firstByte = in.read();