bor*_*orq 5 sockets networking iostream blackberry 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条件是否有效.
正如我在上面的评论中指出的,我需要一种方法来确定我正在连接的设备是否不存在,我通过查看“ping”是否返回任何数据来做到这一点。如果设备不存在,它将阻塞。我不能依赖这种行为。解决这个问题时出现的另一个问题是,如果您提供的缓冲区大于您想要返回的数据,则 RIM InputStream 类的 read(...) 方法会阻塞。但是如果 available() 返回 0,我该如何知道有多少数据呢?逐字节读取是执行此操作的唯一方法,但如果没有数据,它仍然会阻塞。
为了解决这个问题,我遵循了第一个答案的主题,但我将此方法放在自己的线程上,并将其写入单独的字节缓冲区。我创建了一个扩展 InputStream 并实现 available() 和 read(...) 的类。可用返回字节缓冲区中有多少字节,只读返回缓冲区中有多少字节或调用者请求多少字节,以较小者为准。
此设置允许我使用 InputStream 接口,但在幕后它只是一个持续运行的读取器线程,在连接断开之前一直处于活动状态。此时读取如果被阻塞,将抛出异常以指示连接已关闭。这种行为很好,因为它很容易处理。
感谢以上所有帮助解决此问题的人。您的想法有助于找到解决方案。