Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 蓝牙服务器读取性能_Java_Performance_Bluetooth_Inputstream_Bluecove - Fatal编程技术网

Java 蓝牙服务器读取性能

Java 蓝牙服务器读取性能,java,performance,bluetooth,inputstream,bluecove,Java,Performance,Bluetooth,Inputstream,Bluecove,我的笔记本电脑上运行着一个BlueCove蓝牙服务器程序,等待我的Android手机作为客户端连接(运行我的应用程序)。建立连接后,我可以通过蓝牙将触摸坐标从手机发送到笔记本电脑,坐标用于移动光标。坐标以9字节的字节数组的形式每秒发送约20次: 第一个字节用于描述传输的数据类型(我也在发送其他内容) 字节2-5和6-9用于存储两个浮点值 所有这些都可以工作,但服务器上的读取部分有时有点慢: 为了找出延迟发生的地方,我只运行连接和数据传输所需的部分(当然是在单独的线程中),每次读取新输入时都打

我的笔记本电脑上运行着一个BlueCove蓝牙服务器程序,等待我的Android手机作为客户端连接(运行我的应用程序)。建立连接后,我可以通过蓝牙将触摸坐标从手机发送到笔记本电脑,坐标用于移动光标。坐标以9字节的字节数组的形式每秒发送约20次:

  • 第一个字节用于描述传输的数据类型(我也在发送其他内容)
  • 字节2-5和6-9用于存储两个浮点值
所有这些都可以工作,但服务器上的读取部分有时有点慢:
为了找出延迟发生的地方,我只运行连接和数据传输所需的部分(当然是在单独的线程中),每次读取新输入时都打印一行(因此没有缓慢的输入处理)-有时,当我在手机上“画”一条线时,笔记本电脑上的数据输入是稳定的,当我抬起手指时,数据输入几乎立即结束,但其他时候,读取速度变慢,我仍然会在举起手指两秒钟后调用调试打印行。我可以排除客户端发送是延迟的原因,send方法在那里调用,所有调用都会及时返回。我还通过每三次移动事件只发送坐标来减少发送的数据量

我的问题是:是否有某种方法可以提高服务器的读取性能? 有没有什么方法可以让我找出到底是什么原因导致了那些似乎是随机发生的延迟

我也很好奇,字节数组缓冲区大小是否有经验法则(我认为较高的值在我的情况下没有多大意义,因为我非常频繁地发送需要立即处理的相对较小的数据,但我不确定?)


源代码(服务器端):

建立连接:

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上运行Windows 10 x64和BlueCove版本2.1.1-SNAPSHOT。

您尝试过以下任何一种吗

  • android客户端的flush()
  • 使用IOUtils.copy()代替通常的字节写入管道代码