【发布时间】:2016-04-09 09:42:57
【问题描述】:
我有一个 BlueCove 蓝牙服务器程序在我的笔记本电脑上运行,它等待我的 Android 手机作为客户端连接(运行我的应用程序)。建立连接后,我可以通过蓝牙将触摸坐标从手机发送到笔记本电脑,该坐标将用于移动光标。坐标以 9 个字节的字节数组形式每秒发送约 20 次:
- 第一个字节用于描述正在传输的数据类型(我也在发送其他内容)
- 字节 2-5 和 6-9 用于存储两个浮点值
一切正常,但服务器上的读取部分有时有点慢:
为了找出延迟发生在哪里,我只运行了连接和数据传输所需的部分(当然是在单独的线程中)并在每次读取新输入时打印一行(所以没有缓慢的输入处理) - 有时,当我“绘制“我手机上的一条线,笔记本电脑上的数据输入是稳定的,当我抬起手指时几乎立即结束,但其他时候,读取速度变慢,我仍然会在抬起手指两秒钟后调用我的调试打印线手指。我可以排除客户端发送是延迟的原因,那里的发送方法调用都及时返回。我还通过仅从每三个移动事件发送坐标来减少发送的数据量。
我的问题是:有什么方法可以提高服务器的读取性能吗? 有什么方法可以让我找出究竟是什么原因导致这些似乎随机发生的延迟?
我也很好奇,如果字节数组缓冲区大小有经验法则(我认为更高的值在我的情况下没有多大意义,因为我经常发送相对较小的数据块需要立即处理,但我不确定?)。
源代码(服务器端):
建立连接:
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import java.io.IOException;
public class WaitThread implements Runnable {
private static final UUID MY_UUID =
new UUID("514C8B00AD8311E5A8370800200C9A66", false);
public WaitThread() { }
@Override
public void run() {
waitForConnection();
}
private void waitForConnection() {
LocalDevice localDevice = null;
StreamConnectionNotifier server;
StreamConnection connection = null;
try {
localDevice = LocalDevice.getLocalDevice();
localDevice.setDiscoverable(DiscoveryAgent.GIAC); // General/Unlimited Inquiry Access Code
String url = "btspp://localhost:" + MY_UUID.toString() + ";authenticate=false;encrypt=false";
server = (StreamConnectionNotifier) Connector.open(url);
while (true) {
System.out.println("waiting for connection...");
connection = server.acceptAndOpen();
Thread processThread = new Thread(new ProcessConnectionThread(connection));
processThread.start();
}
} catch (BluetoothStateException e) {
e.printStackTrace();
return;
} catch (IOException e) {
e.printStackTrace();
}
}
}
读取输入:
import java.io.InputStream;
import javax.microedition.io.StreamConnection;
public class ProcessConnectionThread implements Runnable {
private StreamConnection streamConnection;
public ProcessConnectionThread(StreamConnection connection) {
streamConnection = connection;
}
@Override
public void run() {
try {
InputStream inputStream = streamConnection.openInputStream();
System.out.println("waiting for input");
byte[] input = new byte[64]; // buffer size ?
int numberOfBytesReceived;
while (true) {
numberOfBytesReceived = inputStream.read(input);
System.out.println("read data");
//processInput(input, numberOfBytesReceived)
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
笔记本电脑在winsock上运行带有BlueCove 2.1.1-SNAPSHOT版本的Windows 10 x64。
【问题讨论】:
标签: java performance bluetooth inputstream bluecove