5

我目前正在黑莓上编写一个应用程序,以简单地将一些原始数据发送和接收到我网络上另一个基于 TCP 的设备。我在 Blackberry 模拟器中遇到了同样的问题,其中有一个 MDS 模拟器正在运行并使用物理电话与我公司的 MDS 服务器通话。请注意,直接使用 wifi 而不是通过 MDS 时不会发生此问题。

问题是 InputStream 上的 available() 函数返回零,除非我先调用 read()。如果我先调用 read (知道有一些可用数据.. 谢谢wireshark),数据会返回,随后对 available() 的调用表明剩下哪些数据我没有读取。问题是我不能总是保证数据会在那里,所以我可以阻止。有没有人意识到这一点,这是一个问题还是设计使然?

有没有人知道一种方法来测试 read() 方法是否会在调用它们之前阻塞?

这基本上是我正在做的事情:

SocketConnection s = (SocketConnection)Connector.open("socket://1.2.3.4:port;deviceside=false", Connector.READ_WRITE);

OutputStream o = ((StreamConnection)s).openOutputStream();
InputStream i = ((StreamConnection)s).openInputStream();

o.write("你好");
Thread.sleep(有时);
如果 (i.available() > 0) {
   字节[]数据=新数据[10];
   int bytesRead = i.read(data);
   System.out.println("Read [" + new String(data) + "] (bytes = " + bytesRead + ")");
}

我必须注释掉 if 条件才能使它起作用。

4

2 回答 2

3

InputStream.available() 方法的一般约定是它“返回可以从此输入流中读取(或跳过)的字节数,而不会被该输入流的方法的下一个调用者阻塞。” 因此,在大多数实现中,不能保证它会返回正在读取的流的内容长度。因此,最好按以下方式阅读

byte[] readFromStream(InputStream is) throws IOException
{
    byte[] data = new byte[4096];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);

    int count = is.read(data, 0, data.length);
    while (count != -1)
    {
        dos.write(data, 0, count);
        count = is.read(data, 0, data.length);
    }

    data = baos.toByteArray();

    return data;
}

您调用 readFromStream() 方法并获取返回的 byte[]。

于 2009-08-24T06:39:52.287 回答
0

正如我在上面的评论中指出的那样,我需要一种方法来确定我正在连接的设备是否不存在,我通过查看我们的“ping”是否返回任何数据来做到这一点。如果设备不存在,它将阻塞。我不能依赖这种行为。解决此问题时出现的另一个问题是,如果您提供的缓冲区大于您想要返回的数据,则 RIM InputStream 类的 read(...) 方法会阻塞。但是如果 available() 返回 0,我怎么知道有多少数据呢?逐字节读取大约是做到这一点的唯一方法,但如果没有数据,它仍然会阻塞。

为了解决这个问题,我遵循了第一个答案的主题,但我把这个方法放在了它自己的线程上,并让它写入一个单独的字节缓冲区。我创建了一个扩展 InputStream 并实现了 available() 和 read(...) 的类。Available 返回字节缓冲区中有多少字节,而 read 只返回缓冲区中有多少字节或调用者请求多少字节,以较少者为准。

这个设置让我可以使用 InputStream 接口,但在幕后它只是一个持续运行的读取器线程,它在连接断开之前一直处于活动状态。那时读取,如果被阻塞,会抛出异常,表示连接关闭。这种行为很好,因为它很容易处理。

感谢以上所有帮助解决此问题的人。您的想法有助于解决问题。

于 2009-09-11T19:13:20.793 回答