【问题标题】:MIDP 2.0 TCP ClientMIDP 2.0 TCP 客户端
【发布时间】:2010-02-19 13:06:30
【问题描述】:

我正在尝试开发一个在使用 MIDP 2.0 和 CLDC 1.1 的移动设备上运行的 TCP 客户端。我正在尝试一些示例代码,但遇到以下问题:

当我尝试(从 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:socket::read 期间出现未知错误 10053 在 com.sun.midp.io.j2me.socket.Protocol.read0(), bci=0 在 com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(),bci=12 在 com.sun.midp.io.BufferedConnectionAdapter.readBytes(),bci=36 在 com.sun.midp.io.BaseInputStream.read(),bci=227 在 com.sun.midp.io.BufferedInputStream.fill(),bci=172 在 com.sun.midp.io.BufferedInputStream.read(),bci=16 在 hello.Client.run22222(Client.java:60) 在 hello.HelloMIDlet.startApp(HelloMIDlet.java:193) 在 javax.microedition.midlet.MIDletTunnelImpl.callStartApp(),bci=1 在 com.sun.midp.midlet.MIDletPeer.startApp(),bci=7 在 com.sun.midp.midlet.MIDletStateHandler.startSuite(),bci=269 在 com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52 在 com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8 在 com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161 在 com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

导致异常的行是这样的:

firstByte = in.read();

我正在阅读一个单独的线程。当我发送请求并尝试使用同一服务器读取它们时,我遇到了同样的错误。服务器是一个简单的回显服务器,没什么复杂的。

附:我知道代码的编写方式看起来像 C#,但它是 Java,我觉得这样更容易阅读和遵循。

谢谢。

【问题讨论】:

  • 顺便说一句,你觉得哪个部分看起来像 C#?我没看到。
  • 我的意思是我放置大括号和缩进的方式。

标签: java-me midlet midp


【解决方案1】:

我首先看到的是您误用了available()。它很可能没有做你希望它做的事情。

available() returns an estimate。它的 JavaDoc 继续明确说明这一点:

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

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

在一个应该立即返回并且不读取任何内容的符合要求的实现中,但是您很容易在一个不太完美的实现中触发一个错误。

【讨论】:

  • 但是如果有 0 个字节可用,Read 方法不会返回 -1 吗?
  • 第一行的那个?可能只有一个字节可用。
  • 我明白了。我正在考虑制作一个固定大小的缓冲区,但是,因为这就像某种虚拟示例,所以我从书中复制了所有内容,以便我可以先了解它是如何工作的。感谢您为我指出这一点:)
  • 拥有固定数组的一种简单方法是确保流中的前四个字节与即将到来的数据大小一致。读取这四个字节并计算大小后,您可以制作字节数组。当然不必是完整的四个字节;取决于您的需求。
  • 感谢您的提示,但是,如果您不偏离我首先提出的问题,我将不胜感激。
【解决方案2】:

这个例子似乎有效: http://www.java-samples.com/j2me/socket-connection-free-j2me-sample-program.htm

问题可能是我将客户端实现为由 midlet 调用的类吗?

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2011-08-08
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多