使用MDS使用SocketConnection与Blackberry进行问题

时间:2009-08-21 18:59:19

标签: networking sockets blackberry iostream mds-cs

我目前正在Blackberry上编写一个应用程序来简单地发送和接收一些原始数据到我网络上的另一个基于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("hello");
Thread.sleep(sometime);
if (i.available() > 0) {
   byte[] data = new data[10];
   int bytesRead = i.read(data);
   System.out.println("Read [" + new String(data) + "] (bytes = " + bytesRead + ")");
}

我必须评论if条件是否有效。

2 个答案:

答案 0 :(得分: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 []。

答案 1 :(得分:0)

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

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

此设置允许我使用InputStream接口,但在幕后它只是一个连续运行的读取器线程,直到连接被删除为止。此时,如果被阻止,则读取将抛出异常以指示连接已关闭。这种行为很好,因为它很容易处理。

感谢上述所有帮助解决此问题的人。您的想法有助于实现解决方案。