Android +蓝牙(Bluecove) - 需要关闭OutputStream才能实际写入数据

时间:2012-10-15 21:30:54

标签: android bluetooth bluecove

我有Android设备充当客户端,PC是蓝牙服务器,使用Bluecove库

来自客户的代码段:

btSocket = serverBt.createRfcommSocketToServiceRecord(myUuid);
btAdapter.cancelDiscovery();
btSocket.connect();

InputStream in = btSocket.getInputStream();
OutputStream out = btSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
InputStreamReader isr = new InputStreamReader(in);
osw.write(55);
osw.flush();
out.flush();
//osw.close();
logTheEvent("Stuff got written, now waiting for the response.");
int dummy = isr.read();
logTheEvent("Servers response: "+ new Integer(dummy).toString());

服务器:

StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open( connectionString, Connector.READ_WRITE );
StreamConnection incomingConnection=streamConnNotifier.acceptAndOpen();
InputStream in = incomingConnection.openInputStream();
OutputStream out = incomingConnection.openOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
InputStreamReader isr = new InputStreamReader(in);
int fromClient = isr.read();
System.out.println("Got from client " + new Integer(fromClient).toString());
osw.write(999);

当取消注释客户端上的 osw.close(); 时,消息会传输到服务器,但是,客户端无法接收响应,IOException并显示消息“套接字已关闭“被抛出。 但是,当注释 osw.close(); 时,客户端和服务器都会冻结: A.客户端当然会依赖于阅读服务器的响应 B.服务器挂起在streamConnNotifier.acceptAndOpen();

应该采取哪些措施来实现双向通信? 是我的代码,还是PC Bluetoototh堆栈,还是bluecove的责任?

1 个答案:

答案 0 :(得分:2)

蓝牙使用缓冲输出。这意味着存在一个小内存位置,其中包含您写入流的所有数据。当此内存位置变满时,它会将缓冲区数据写入数据包中的套接字。当您过早关闭套接字时,该缓冲区将被擦除,数据就会消失。

为了强制流写,请尝试调用flush()

您可以做的其他事情是将缓冲区大小设置得非常小,因此数据总是被写入。但是,如果你这样做,表现将不会很好。

不幸的是,我没有编写所有代码,但是有一个基础项目here